開発者目線で 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 SQLite
バックグラウンドプロセス
• iPhone
不可 ( 音楽など一部例外あり )
• Android
Service
グラフィック
• iPhone 2D
Quartz 2D(Mac OS X 共通 ) Core Image(Mac OS X 共通 ) 3D
OpenGL ES
ベクターグラフィック 対応
• Android 2D
SGL
android.graphics パッケージにある部品群 3D
OpenGL ES
ベクターグラフィック
非対応 ( 代わりに 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 を比較し てみる