Comments
Description
Transcript
Android 小山 圭 IBM STS System X ATS
Android IBM STS System X ATS 小山 圭 注意 この資料は私が個人的に調査した結果です 内容の正確性は保証しません 記述時のAndroid SDKはm5です 0.9及びそれ以降のSDKには対応しません Agenda What’s Android? • Androidとは何でしょう? Android Anatomy • Androidの解剖 Android Application Programming • Android向けアプリケーション開発 デモ まとめ What’s Android What’s Android 携帯電話向けプラットフォーム • ≠OS OHA:Open Handset Alliance • Docomo、KDDI参加 • Willcomなど試験機公開 オープンソース • GPL部分は公開済み • 他は正式版(実機)公開後リリース予定 Apache2.0 JavaSEによる開発 既存のJavaMEの問題 • JavaSEとの非互換 同じクラス名でもメソッドの有無が違う 複雑で多種多用なプロファイルの存在 • Doja、IMP、MIDP、オプションJSRの存在 AndroidはJavaSE5対応 • 基底クラスは皆同じ • annotationもgenericsもenumも使える • apache HTTP Client等も標準装備 生産性が全然違う! • ただし一部のクラスなし(XPathなど) Android Anatomy アンドロイドの解剖 Android Architecture Linux Android ≠ Linux • 交換可能、ただしUNIXの設計に依存 Standard Linux 2.6.24に独自パッチ glibcをサポートしない パーミッションベースドセキュリティモデル • 1アプリケーション=1ID より積極的なパワーマネジメント • WakeLockの採用 Kernelのソース http://git.android.com GPL部分は(当然)全て公開されている BIONIC 独自libc • glibc非互換、POSIX非互換 ユーザー空間をGPLから離す • freeBSD small fast • cutsom pthread システムプロパティ、logging Webkit フルブラウザ オープンソース • http://webkit.org Full CSS, Javascript, DOM, AJAX support SQLite 軽量トランザクショナルデータストア プラットフォームのデータストア • ほぼ全てのデータがSQLiteにて管理される ContentProviderにて利用 Hardware Abstraction Layer ユーザー空間のC/C++ライブラリ層 ハードウェアドライバの実装に必要なインターフェイ スを定義する Androidプラットフォームのロジックをハードウェアイ ンターフェイスから分離する • ハードウェアメーカーはデバイスドライバを公開したくない • GNU/Linuxとドライバを分離/独立させる Dalvik Virtual Machine 独自のクリーンルーム開発仮想機械 最適化されたフォーマット • (.dex) • 非公式解析: http://www.retrodev.com/android/dexformat.html Dalvik Byte Code • • • • JVM Byte Codeがdexに翻訳される 複数のclassが一つのファイルに最適化 JVM(スタック機械)⇔Dalvik(レジスタ機械) ARMへの最適化、JIT無し Android Application Programming アプリケーションの開発 開発環境の用意 SDKのダウンロード • http://code.google.com/android Eclipseプラグイン • “software updates”からインストール • SDKの場所をプラグインに設定してください CUIでも開発できます • activityCreate、ant アプリケーションの構成要素 Activity • 画面(UI)を持つアプリの基本構成要素 Intent • アクティビティ間の(非)同期通信パラメータ Service • 常駐アプリ、サービス、デーモン Content Provider • システムデータストレージへのアクセスを提供 Activity android.app.Activity アプレットのようなもの • main関数はありません • システムがコールバック関数を呼びます ビッグクラス:超多機能 ライフサイクルはシステムが管理します • いきなり消えます 電話受信、アラームオン、バッテリーアラート、等 • いきなり殺されます 携帯ですのでメモリ小さい、バッテリー超重要 • 大切なものはコールバックにて退避して下さい Hello World! package com.android.hello; import android.app.Activity; import android.os.Bundle; public class HelloAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); } } 文字列”Hello World!”はどこ? ディレクトリ構造/リソース ディレクトリ構造は固定 R.java • 自動作成識別子 リソース”res” レイアウト • Activityの画面設計 drawable • イメージ等 values • 可読リソース • メッセージ Layout記述xmlファイル <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Hello, Android"/> 画面設計はXMLにて記述 • プログラムでも書ける XMLタグ名がAndroidのコンポーネントに対応する • AndroidのJavaDocにはXML属性の記述がある • XML属性名と同じ動作を行うメソッド名は一致しない 上記は親(Homeアプリ)を埋める、つまり画面最大 “Hello, World”の文字列はここで設定していた タグにIDを設定すると自動生成クラスRから参照できる AndroidManifest.xml Activityの登録 アプリケーション名、アイコンの登録 • idとリソースの関連に注意 Intent Filterの記述 セキュリティ上の許可を記述 最初は全自動で作成されます <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.hello"> <application android:icon="@drawable/icon"> <activity android:name=".HelloAndroid" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> values/strings.xml アプリケーション名 文字列リソース • エラーメッセージ等 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Hello, Android</string> </resources> Activity Life Cycle http://homepage3.nifty.com/rio_i/lab/android/010lifecycle.html Activity ライフサイクル とりあえずこの4つを重視 onCreate • アプリ(再)スタート地点 • freeze後解凍時にはBundle icicleを利用する onStart • 画面作成後、オンメモリでの復帰地点 onPause • アプリが見えなくなると呼ばれる • 必要なデータを保存する onFreeze (→ Ver0.9: onSaveInstanceState に改名) • アプリ停止時に呼ばれる • アプリの状態保存を行う 画面設計 LayoutとViewの関係 Layoutはコンポーネントを並べます • Viewを詰めます • 詰め方をレイアウトします Viewはコンポーネントです • テキストやボタン等の部品 数がものすごいのでここでは紹介しません API Demoにほとんどのデモがあります • でも全部ではないので注意! Animation 文字通りコンポーネントをアニメする • フェードイン • 拡大、縮小、回転、etc システムに標準でいくつかあります 自由に作れます • マトリックス計算 • αブレンディング view.startAnimation()するだけです! DroidDraw レイアウトXML作成ツール/ http://www.droiddraw.org Intent Activity間通信 Intent (1/2) 別Activityの実行時にIntentを用いる アクティビティは通常1画面 • 次の画面に移るときには別のActivityを実行 startActivity, startSubActivity 実行対象の指定が可能 • クラス名の設定 実行対象を知らなくても良い • • Uriやactionを用いたIntentブロードキャスト manifestにてintent-filterを指定する Intent (2/2) Intentには • 実行Activityの選択 クラス名 URI • アクションの指定 VIEW,EDIT,UPDATE 等 • 実行先Activityへのパラメータを保持 Uri + Action = Restful Intent使用例 公式チュートリアルNotepadV2 • • • NoteEditがサブアクティビティClass SQLiteからパラメータを用意 アクションはACTIVITY_EDIT @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Cursor c = mNotesCursor; c.moveTo(position); Intent i = new Intent(this, NoteEdit.class); i.putExtra(NotesDbAdapter.KEY_ROWID, id); i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString( c.getColumnIndex(NotesDbAdapter.KEY_TITLE))); i.putExtra(NotesDbAdapter.KEY_BODY, c.getString( c.getColumnIndex(NotesDbAdapter.KEY_BODY))); startSubActivity(i, ACTIVITY_EDIT); } Intentの受取 公式チュートリアルNotepadV2 • onCreateの中でgetIntent() • アクションが1種類しかないので使っていない Bundle extras = getIntent().getExtras(); if (extras != null) { String title = extras.getString(NotesDbAdapter.KEY_TITLE); String body = extras.getString(NotesDbAdapter.KEY_BODY); mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID); Intentの受け取り2 公式サンプル NoteListのNoteEditor • エディタ側にてアクションを判断している final String action = intent.getAction(); if (action.equals(Intent.EDIT_ACTION)) { // Requested to edit: set that state, and the data being edited. mState = STATE_EDIT; mURI = intent.getData(); } else if (action.equals(Intent.INSERT_ACTION)) { // Requested to insert: set that state, and create a new entry // in the container. Intentの利用例2 Google Map アプリの実行 startActivity( new Intent(android.content.Intent.VIEW_ACTION, Uri.parse("geo:49.473367,8.660274"))); ※Intentに対する実行アプリは変更できる AndroidManifest.xmlのIntentFilterの記述にて別アプリが受信可能 http://www.anddev.org/tinytut_-_replacing_system_application_ie_maps-t2105.html 突然ですが、デモします! Service Service 画面がなく独立した常駐型プロセス android.app.Serviceを継承 Intentによる実行、停止、(un)bind IPC:Inter-Process Communication • 分散オブジェクト指向 異なるプロセスのオブジェクト間にてメソッド実行 • IDLとStubの使用 IDL記述によるメソッド型の定義 Stubの自動生成 • オブジェクトのシリアライズは用いない Parcel AIDL:Android Interface Definition Language JavaのInterfaceに方向の記述を追加 • in,out,inout, プリミティブは値渡し Serviceのメソッドを定義する ファイル拡張子”.aidl”を記述 • Eclipse: 自動的に”.java”ファイルに変換 • CLI: aidlコマンドを利用 Interface.Stubを継承して実装 • • Service内にて実装 Service.onBind()にて配布 サービスの実行 Activity 作成/実行 startService(Bundle) bindService(ServiceConection) 接続 ServiceConnection.onConnect(IBinder) Interface.Stub.asInterface(IBinder) 取得 Service Service.registerCallback(Callback) 登録 Service.method() サービスの利用 Callback.method() コールバックの利用 Service ContentProvider ContentProvider URI形式でシステムデータにアクセス • 電話帳など全てのデータはURIでアクセス • なんとSDカード上のMP3やビデオも! RESTful Androidの大切なポイントです! • データベースを意識しないで高度なデータ管理 でも実装は大変です(笑 • SQLiteに皮被せてます 時間がなくてもデモ linux上からdbの存在を確認 SDカードの利用/MediaScanner 自作 MP3 Player Service/Notification ContentProvider of MP3 はまりどころ アプレットと同様、タイミングはシビアです • onCreateではサイズなど取れません onCreateなどの中では画面更新されません • Handlerの使用 実行時間がシビアです • 5秒以内に終らないと殺されます まとめ Androidは高レベルな携帯プラットフォーム です アーキテクチャがほれぼれします • さすがGoogleです 生産性高いです 作ってて楽しい! • 俺ってスゲーをJavaで体験できます! Android、始めてみませんか? 補足情報 公式情報 公式サイト • http://code.google.com/intl/ja/android/ 公式コミュニティ • http://groups.google.co.jp/group/androidSDKJapan • http://groups.google.co.jp/group/androiddevelopersjapan • http://groups.google.co.jp/group/androidinternals Google IO 講演資料 • http://sites.google.com/site/io/