開発者目線でAndroidとiPhoneを比較してみる 豆蔵 藤田泰介
技術情報 iPhone iPhone Dev Center iPhone Dev Center(日本語) Android Android - An Open Handset Alliance Project Android - Open Handset Alliance プロジェクト
OS iPhone Mac OS Xベース Android Linuxベース
開発言語/開発環境 iPhone Objective-C 2.0(ガベージコレクションなし) Xcode Interface Builder(画面デザイン用の開発環境) Android Java SDK 1.5または1.6相当のもの(SunのJavaとVMが違うのでこのような書き方をしています) Eclipse ADT(Eclipseプラグイン)
動作環境 iPhone Mac OS X 10.5.4以上 Toolchainというオープンソースの開発環境だとUnix/Linux系OSで開発可能 Android Windows Mac Unix/Linux
アーキテクチャ iPhone Android
フレームワーク iPhone Cocoa Foundation(Mac OS X共通) UIKit Android Java SDK相当のもの Android Framework
MVCパターンからみた違い(iPhone) Model 任意(Model用の仕組みがない) View UIKitライブラリ、UIViewのサブクラス Interface Builerを使ってデザイン デザインの情報はxibファイルに保存される(中はXML) Controller UIViewController UINavigationController UIImagePickerController UITabbarController UITableViewController
MVCパターンからみた違い(Android) Model ContentProvider View android.view,android.widgetパッケージにある部品群 レイアウトXMLにデザイン定義を書く デザインの情報はxmlファイルに保存される Controller Activity ListActivity MapActivity ExpandableListActivity TabActivity
Viewの実装方法 AndroidとiPhoneのViewの実装方法を比較する
イベントの仕組み iPhone Target Action Responder Chain Android イベントリスナー
イベントの実装方法 AndroidとiPhoneのイベントハンドラの実装方法を比較する
ライフサイクル iPhone loadView viewDidLoad viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear Android onCreate onStart onResume onPause onStop onDestroy
メモリ領域圧迫時のイベント iPhone didReceiveMemoryWarning Android onLowMemory
データ保存の仕組み Androidの場合SQLiteに保存したデータをContent Provider化することで他のアプリとデータベースを共有することができます。iPhoneは今のところデータベースがアプリごとに独立しているので他のアプリと共有することはできないようです。 iPhone オブジェクトのシリアライズ プロパティリスト(XML) SQLite Android
バックグラウンドプロセス iPhone 不可(音楽など一部例外あり) Android Service
グラフィック iPhone 2D Quartz 2D(Mac OS X共通) Core Image(Mac OS X共通) 3D OpenGL ES ベクターグラフィック 対応 Android SGL android.graphicsパッケージにある部品群 非対応(代わりに9-patchを使う)
アニメーション iPhone Core Animation(Mac OS X共通) Android android.view.animationパッケージにある部品群
加速度計 iPhone UIAccelerometer(加速度計の管理) UIAccelerometerDelegate(加速度イベント) Android 加速度計に限らずあらゆるセンサーを管理するSensorManagerクラスがありそこで管理されている SensorManager(センサーの管理) SensorListener(センサーイベント) 詳細 AndroidとiPhoneの加速度計アプリの実装方法を比較してみる
リソース(iPhone) Resourcesフォルダ以下に保存 NSBundleクラスからmainBundleオブジェクトを取得する // 画像のパスを取得する NSString *imagePath = [NSBundle mainBundle] pathForResource:@"Hoge" ofType:@"png"]; UIImage *image = [UIImage imageAtPath:imagePath];
リソース(Android) Resourcesフォルダ以下に保存 Rクラスの定義を使って取得する // Activityクラスでの取得方法 Drawable drawableb = getResources().getDrawable(R.drawable.hoge)
国際化(iPhone) 言語.lproj(例:Japanese.lproj)フォルダを作成しそこにLocalizable.stringsファイルを格納する Localizable.stringsファイルにローカライズしたメッセージを格納する 文字以外にもプロパティリストやnibファイル、SQLiteデータベースなどもローカライズできる
国際化(Android) 各言語ごとに/res/valuesフォルダを作成しstrings.xmlファイルを格納する 今のところ文字列以外はローカライズできないみたいです。 res |--values-en | `--strings.xml `--values-ja `--strings.xml
ロケーション iPhone Core Location CLLocationManager CLLocationManagerDelegate CLLocationManagerを直接インスタンス化できる Android android.locationパッケージのクラス群 LocationManager LocationListener LocationManagerを直接インスタンス化することができない。 Context.getSystemService(Context.LOCATION_SERVICE)メソッドを使ってインスタンスを取得する
参照 開発者目線でAndroidとiPhoneを比較してみる