From iOS to Android

94
MADRID · NOV 21-22 · 2014 From iOS To Android(or reverse) José Manuel Ortega Candel @jmortegac http://www.linkedin.com/jmortega1

Transcript of From iOS to Android

Page 1: From iOS to Android

MADRID · NOV 21-22 · 2014

From iOS To Android(or reverse)

José Manuel Ortega Candel

@jmortegac

http://www.linkedin.com/jmortega1

Page 2: From iOS to Android

MADRID · NOV 21-22 · 2014

https://speakerdeck.com/jmortega/

Page 3: From iOS to Android

MADRID · NOV 21-22 · 2014

ARCHITECTURE / iOS / ANDROID

TOOLS XCODE vs ANDROID STUDIO

APPLICATIONS / PERMISSIONS / PRIVACY

USER INTERFACE

STATIC ANALYSIS CODE / TESTING

CERTIFICATES AND SIGNING

EMULATORS / MEMORY MANAGEMENT/ DATABASE

APP PUBLISHING / DEVELOPER LIBRARIES

Page 4: From iOS to Android

MADRID · NOV 21-22 · 2014

ARCHITECTURE

Page 5: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Architecture

DALVIK ART

Just-In-Time (JIT) Compilation Ahead-Of-Time (AOT)

Compilation

Cache builds up over time

Boot times are faster

Cache is built at first boot

Rebooting device takes

significantly longer

Apps compiled when executed Stores Compiled Apps

Consumes much more internal

storage space

Page 6: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Architecture

Page 7: From iOS to Android

MADRID · NOV 21-22 · 2014

TOOLS

Page 9: From iOS to Android

MADRID · NOV 21-22 · 2014

on Android Studio

InteliJ IDE Based Maven based Build Dependency Combines Ant && Maven / Gradle Tasks

Page 10: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Studio

Templates

Page 11: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Studio

Project settings

Page 12: From iOS to Android

MADRID · NOV 21-22 · 2014

XCode

Provides multiple ios app templates

Page 13: From iOS to Android

MADRID · NOV 21-22 · 2014

Xcode Project

Testing on device

Base SDK

Page 14: From iOS to Android

MADRID · NOV 21-22 · 2014

Interface Builder

Page 15: From iOS to Android

MADRID · NOV 21-22 · 2014

Instruments on iOS

Debugging, performance analysis, and testing

Real-time CPU, memory, disk, energy, and network

usage

Threads, network, and energy usage

I/O system and thread activity

Allows detecting memory leaks

Page 16: From iOS to Android

MADRID · NOV 21-22 · 2014

APPLICATIONS

Page 17: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Applications

Page 18: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Layout Manager+ Device Preview

Page 19: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Applications

import android.os.Bundle;

import android.app.Activity;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);}

} public static void invokeWebBrowser(Activity activity){

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.google.com"));

activity.startActivity(intent);

}

Activity

Intents [Explicit,Implicits]

Services

Content Providers[Sharing data between apps]

Fragments from 3.0

Page 20: From iOS to Android

MADRID · NOV 21-22 · 2014

Android components

Page 21: From iOS to Android

MADRID · NOV 21-22 · 2014

Android’s RecyclerView

Adapter

ViewHolder

LayoutManager

ItemDecoration

ItemAnimator

https://developer.android.com/training/material/lists-cards.html

Page 22: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Navigation Drawer

Page 23: From iOS to Android

MADRID · NOV 21-22 · 2014

Layout Systems

UINavigationBar

UITableView

TextView

TextView

LinearLayout

TextView

TextView

Page 24: From iOS to Android

MADRID · NOV 21-22 · 2014

LifeCycle Applications

Page 25: From iOS to Android

MADRID · NOV 21-22 · 2014

LifeCycle Applications

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window.rootViewController = self.navigationController;

[self.window makeKeyAndVisible];

return YES;

}

Page 26: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

C

Objective –C,[message passing]

Swift

PlayGround for leaning Swift

Programming with Objetive-C in windows/

linux

http://www.gnustep.org/

https://developer.apple.com/swift

Page 27: From iOS to Android

MADRID · NOV 21-22 · 2014

Objective-C vs Swift

NSString *string = @“hello”;

let string = "hello" as NSString

let s: NSString = "hello"

var string: NSString = "hello"

string= "Hello"

NSLog(@“This is a string”); println("This is a string");

NSArray *myArray = [NSArray

arrayWithObjects:@“string1",

@“string2", nil];

var myArray = [“string1", "string2"]

var myArray : [String] =

[“string1", "string2"]

Page 28: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

@synthesize will generate getter and setter

methods for your @property

@interface MyObject:NSObject {

NSString *_name;

}

@property (nonatomic,assign) NSString* name;

@end

@implementation MyObject

@synthesize name = _ name;

@end

Page 29: From iOS to Android

MADRID · NOV 21-22 · 2014

UIKit Framework

UIButton

UILabel

UIImageView

UITextField

UIPickerView

UIWindow

UIView

UIViewController

NSObject,NSString,NSMutableString, NSDate,NSNumber

Collections(NSArray, NSDictionary, NSSet,NSEnumerator)

Foundation Framework

Page 30: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

UIViewController is the parent for view Controllers

Page 31: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

Organizer

Page 32: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

Snippets in XCode

Page 33: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

Page 34: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController <UITableViewDataSource,

UITableViewDelegate>{

IBOutlet UITableView *table;

NSMutableData *dataReceive;

}

@property(nonatomic,assign) NSMutableData *dataReceive;

@end

UIViewController interface MyViewController.h

implementation MyViewController.m @implementation MyViewController

@synthesize dataReceive,table;

- (void)viewDidLoad{

[super viewDidLoad];

NSURL *url = [[NSURL alloc] initWithString:@“url"];

self.dataReceive = [[NSMutableData data] retain];

}

Page 35: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

UINavigationController

Page 36: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Applications

UINavigationController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary

*)launchOptions {

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

//Recuperamos el ViewController

UIViewController *rootViewController = [storyboard instantiateInitialViewController];

// Creamos un UINavigationController, que se encargará de controlar y almacenar los distintos

viewControllers de nuestra aplicación.

UINavigationController *navigationController = [[UINavigationController

alloc]initWithRootViewController:rootViewController];

//Asignamos el navigationController como principal.

self.window.rootViewController = navigationController; return YES;

}

-(IBAction)goToPantalla2:(id)sender { UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

//Obtenemos el controlador con Identifier "Pantalla2"

Pantalla2ViewController *pantalla2Controller = [storyBoard

instantiateViewControllerWithIdentifier:@"Pantalla2"];

//Lanzamos el controlador en el navigation de forma animada:

[self.navigationController pushViewController:pantalla2Controller animated:YES]; }

Page 37: From iOS to Android

MADRID · NOV 21-22 · 2014

Design patterns on iOS Applications MVC

Target-action

Delegate and protocols

A delegate is an object that control of the user interface for that event.

Page 38: From iOS to Android

MADRID · NOV 21-22 · 2014

ViewPager / UIPageViewController

Swipe gesture

Page 39: From iOS to Android

MADRID · NOV 21-22 · 2014

Multilanguage

NSString *localizedString =

NSLocalizedString(@"Hello",@“DefaultString");

Page 40: From iOS to Android

MADRID · NOV 21-22 · 2014

Certificates and Signing

Android iOS

Self-signed certificate

Apps are signed by

developers

Apple certificate

Apps are signed by Apple

Java Keytool

Generate a distribution

provisioning profile

Export + Sign APK

iOS Provisioning Portal

Debug and distribution

certificate

App ID (unique ID of your app)

Set of device unique identifiers

Developer certificate

Page 41: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Studio

Export + Sign APK

Page 42: From iOS to Android

MADRID · NOV 21-22 · 2014

PERMISSIONS

Page 43: From iOS to Android

MADRID · NOV 21-22 · 2014

Permissions on Android

AndroidManifest.xml Protection mechanism to interact with other

applications

<uses--‐permission android:name="android.permission.INTERNET"/>

<uses--‐permission

android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses--‐permission

android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses--‐permission

android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses--‐permission

android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Page 44: From iOS to Android

MADRID · NOV 21-22 · 2014

Permissions on iOS o Declare your application requirements in its manifest-like Info.plist.

This is used only for ensuring device compatibility.

o UIRequiredDeviceCapabilities allows you to list

’hardware-like’ capabilities that your app needs.

o AppStore reads this information for filter installer

devices.

Page 45: From iOS to Android

MADRID · NOV 21-22 · 2014

Permissions on iOS

Privacy Analysis Tools for iOs Applications

patia.unileon.es

Page 46: From iOS to Android

MADRID · NOV 21-22 · 2014

Privacy

Permission Manager

Page 47: From iOS to Android

MADRID · NOV 21-22 · 2014

USER

INTERFACE

Page 48: From iOS to Android

MADRID · NOV 21-22 · 2014

Evolution

Page 49: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Material design

Minimalist and consistency

Transitions, animiations

Cards

https://developer.android.com/training/material/get-started.html

Page 50: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Material design

Ldrawer

https://github.com/kanytu/android-material-drawer-template

https://github.com/IkiMuhendis/LDrawer

<?xml version="1.0" encoding="utf-8"?>

<resources>

<style name="AppTheme"

parent="android:Theme.Material.Light">

<item name="android:colorPrimary">

@color/primary</item>

<item name="android:colorPrimaryDark">

@color/primary_dark</item>

<item name="android:colorAccent">

@color/accent</item>

<item name="android:textColorPrimary">

@color/text_primary</item>

<item name="android:textColor">

@color/text_secondary</item>

<item name="android:navigationBarColor">

@color/primary_dark</item> </style>

</resources>

Page 51: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Material design

https://github.com/google/iosched

Page 52: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Fragments Fragment is a chunk of user interface with its own life cycle. Fragment must exist within an Activity Interaction with fragments is done through FragmentManager Fragment API was introduced in API 11

http://developer.android.com/tools/support-library

Page 53: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Fragments

Page 54: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Master-Detail template UISplitViewController

Page 55: From iOS to Android

MADRID · NOV 21-22 · 2014

Notifications

Page 56: From iOS to Android

MADRID · NOV 21-22 · 2014

STATIC

ANALYSIS CODE

Page 57: From iOS to Android

MADRID · NOV 21-22 · 2014

Static analysis code on Android Studio

Inspect Profile

Lint

Page 58: From iOS to Android

MADRID · NOV 21-22 · 2014

Static analysis code on Java projects

SonarQube

Sonnar-runner

Page 59: From iOS to Android

MADRID · NOV 21-22 · 2014

Static analysis code on XCode

Static Analyzer

Detect memory leaks

Page 60: From iOS to Android

MADRID · NOV 21-22 · 2014

TESTING

Page 61: From iOS to Android

MADRID · NOV 21-22 · 2014

Mobile Application Testing

TYPES Unit Testing

Functionality Testing

Integration Testing

Regression Load Testing

Stress Testing

Performance

Usability Testing

Page 62: From iOS to Android

MADRID · NOV 21-22 · 2014

Mobile Application Testing

Page 63: From iOS to Android

MADRID · NOV 21-22 · 2014

CheckList

Rotating the screen

Behavior of when network is not

available

Navigation between screens

Behavior of app if app is running for

longer period of time and checking

memory

Page 64: From iOS to Android

MADRID · NOV 21-22 · 2014

Testing on Android

Unit & Integration,TDD

Junit

RoboElectric

Acceptance,BDD

RobotiumTesting User Interface

Calabash

Page 65: From iOS to Android

MADRID · NOV 21-22 · 2014

Unit testing on iOS

XCTest

#import <XCTest/XCTest.h>

#import “TestObject.h"

@interface TestOjectLogicTests : XCTestCase {

@private

TestObject *object;

}

@end

Page 66: From iOS to Android

MADRID · NOV 21-22 · 2014

EMULATORS

Page 67: From iOS to Android

MADRID · NOV 21-22 · 2014

Emulator vs Simulator Android iOS

Emulator Simulator

Very slow integrated with SDK Integrated with Xcode

Emulates hardware and software Simulates only software

Launched apps are equal

binaries from the apps compiled

for Device CPU

Launched apps are different

binaries from the apps compiled

for Device CPU

Page 68: From iOS to Android

MADRID · NOV 21-22 · 2014

Genymotion

Integration with Eclipse and Android Studio

MULTI OS Compatible with Linux,Windows and Mac

Requires VirtualBox

Page 69: From iOS to Android

MADRID · NOV 21-22 · 2014

Alternatives

http://jimulabs.com/ for Android live preview

https://appthwack.com/ for testing in the cloud with real

devices

Page 70: From iOS to Android

MADRID · NOV 21-22 · 2014

MEMORY

MANAGEMENT

Page 71: From iOS to Android

MADRID · NOV 21-22 · 2014

Android Handles memory management

automatically Garbage Collector

iOS release, retain, autorelease

ARC(Automatic Reference Counting)

Developer maintain the count number for each object

Destroys object when reference counting become 0

@autoreleasepool

With ARC, compiler set this methods where its

necessary

Page 72: From iOS to Android

MADRID · NOV 21-22 · 2014

ARC

Migrating to ARC

Project Build Settings

Page 73: From iOS to Android

MADRID · NOV 21-22 · 2014

DATA

PERSISTENCE

Page 74: From iOS to Android

MADRID · NOV 21-22 · 2014

Android iOS

SQLite

android.database.sqlite

Tables and relations

Core Data

Objects

DataModel

Content Providers

/data/data/<Application-Package>

/databases/<database-name>

Only acces with root

DataModel editor in Xcode for

register objects and their

relationships

Page 75: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS Core Data

Page 76: From iOS to Android

MADRID · NOV 21-22 · 2014

Alernatives

http://realm.io/

Android and iOS

Object-oriented API

C++ Core

Page 77: From iOS to Android

MADRID · NOV 21-22 · 2014

SHARED

ACTIONS

Page 78: From iOS to Android

MADRID · NOV 21-22 · 2014

Android

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item

android:id="@+id/share"

android:title="@string/share"

android:showAsAction="ifRoom"

android:actionProviderClass="android.widget.ShareActionProvider"/>

</menu>

private ShareActionProvider mShareActionProvider;

mShareActionProvider.setShareIntent(getDefaultShareIntent());

private Intent getDefaultShareIntent(){

Intent intent = new Intent(Intent.ACTION_SEND); //IMPLICIT INTENT

intent.setType("text/plain");

intent.putExtra(Intent.EXTRA_TEXT,"Extra Text");

return intent;}

Page 79: From iOS to Android

MADRID · NOV 21-22 · 2014

iOS

- (IBAction)shareButton:(UIBarButtonItem *)sender

{

NSString *textToShare = @“textToShare";

UIImage *imageToShare = [UIImage imageNamed:@"yourImage.png"];

NSURL *myWebsite = [NSURL

URLWithString:@"http://www.example.com/"];

NSArray *objectsToShare = @[textToShare, imageToShare ,myWebsite];

UIActivityViewController *activityVC = [[UIActivityViewController

alloc] initWithActivityItems:objectsToShare applicationActivities:nil];

NSArray *excludeActivities =

@[UIActivityTypeAirDrop,UIActivityTypePrint];

activityVC.excludedActivityTypes = excludeActivities;

[self presentViewController:activityVC animated:YES completion:nil];

}

UIActivityViewController

Page 80: From iOS to Android

MADRID · NOV 21-22 · 2014

CHECK

CONNECTIVITY

Page 81: From iOS to Android

MADRID · NOV 21-22 · 2014

Check connectivity on Android

ConnectivityManager

<uses-permission

android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.INTERNET" />

public static boolean checkConnectivity(Context context) {

ConnectivityManager cm

=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

return activeNetwork != null && activeNetwork.isConnectedOrConnecting();

}

Page 82: From iOS to Android

MADRID · NOV 21-22 · 2014

Check connectivity on iOS

Reachability

internetReach = [[Reachability reachabilityForInternetConnection]

retain];

[internetReach startNotifier];

if([internetReach currentReachabilityStatus] == ReachableViaWWAN) {

// Tenemos conexión a Internet

}

wifiReach = [[Reachability reachabilityForLocalWiFi] retain];

[wifiReach startNotifier];

if([wifiReach currentReachabilityStatus] == ReachableViaWiFi) {

// Estamos conectados mediante Wi-Fi

}

Page 83: From iOS to Android

MADRID · NOV 21-22 · 2014

APP

PUBLISHING

Page 84: From iOS to Android

MADRID · NOV 21-22 · 2014

Android iOS

Google requires a one time fee of

US$25

iOS Developer Program

$99 /year

Greater capacity for monetization

Google play + Publish in other

stores like Amazon,Opera

AppStore

Alpha/beta testing before put in

production

Upload to store in 30 min

Review process 5-7 days

Android Developer

Console

Beta Testing

http://ibetatest.com/

http://testflightapp.com/

Page 85: From iOS to Android

MADRID · NOV 21-22 · 2014

Distribution

Page 86: From iOS to Android

MADRID · NOV 21-22 · 2014

Developers

Library

Page 87: From iOS to Android

MADRID · NOV 21-22 · 2014

Async connections

iOS Thread managed by NSURLConnection

Android Services, AsyncTask

Libraries for Android Otto Event Bus,RoboSpice

http://square.github.io/otto/

Page 88: From iOS to Android

MADRID · NOV 21-22 · 2014

https://play.google.com/store/apps/details?id=com.desarrollodroide.repos

Android libraries with demos in GP

Page 89: From iOS to Android

MADRID · NOV 21-22 · 2014

https://developer.apple.com/library/ios/navigation/

iOS Developer library

Page 90: From iOS to Android

MADRID · NOV 21-22 · 2014

Classes comparative iOS Android

Base UIApplication Application

Controller UIViewController Activity/Fragment

Event Emitter Target Action/Responder

Chain

Event Listener i.e. onClick()

Data Saving NSUserDefaults / SQLite SharedPreferences / SQLite

Multi Thread NSThread Thread/AsyncTask/Service

Internationalization NSLocalizedString Resource files

GPS CoreLocation LocationManager

for MapView, use Google

SDK

Accelerometer UIAccelerometer SensorManager

Local Notification UILocalNotification NotificationManager

Remote Push

Notification

Apple Push Notifiation Service

C2DM (external package)

com.google.android.c2dm

Page 91: From iOS to Android

MADRID · NOV 21-22 · 2014

BOOKS

Page 92: From iOS to Android

MADRID · NOV 21-22 · 2014

Page 94: From iOS to Android

MADRID · NOV 21-22 · 2014

Thanks

Questions?