日本Androidの会の資料

1,615 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,615
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

日本Androidの会の資料

  1. 1. Android : Service 小山 圭
  2. 2. Agenda <ul><li>Service とは何でしょう? </li></ul><ul><li>最も簡単な Service </li></ul><ul><li>Notification </li></ul><ul><li>Callback </li></ul><ul><li>まとめ </li></ul>
  3. 3. Android の Service <ul><li>from Anatomy of an Android Application </li></ul><ul><ul><li>A Service is code that is long-lived and runs without a UI. </li></ul></ul><ul><ul><li>UI が無い長生きするコード </li></ul></ul><ul><ul><li>Activity と違いフロントに表示されなくても実行 </li></ul></ul><ul><ul><ul><li>つまり常駐して実行を続けられる </li></ul></ul></ul><ul><ul><li>音楽の再生などに用います </li></ul></ul>
  4. 4. Service の実体 <ul><li>android.app.Service </li></ul><ul><li>Activity と同じく Context を継承 </li></ul><ul><li>Task の 1 要素 </li></ul><ul><li>サービスの実装は Service を継承 </li></ul><ul><li>Context#startService() で起動 </li></ul><ul><li>bindService() で起動中のサービスに接続、起動していなければ起動 </li></ul><ul><li>stopService() にて停止 </li></ul>
  5. 5. Intent <ul><li>Service も Intent をキーに起動します </li></ul><ul><li>Service を止めるキーも Intent です </li></ul><ul><li>設定により他の Activity に公開可能 </li></ul><ul><li>Intent は江川さんにおまかせします >< </li></ul>
  6. 6. Service のライフタイム <ul><li>基本は start されてから stop されるまで </li></ul><ul><li>システムがメモリ状況により殺す場合有り </li></ul><ul><ul><li>ただし殺害対象の優先順位は低い </li></ul></ul><ul><li>bind している client が複数いる間は stop しても止まらない </li></ul>
  7. 7. <service> <ul><li>AndroidMenifest.xml にタグの記述が必要 </li></ul><ul><ul><li>例 ) </li></ul></ul><ul><ul><ul><li><service android:name= &quot;.PlayerService&quot; /> </li></ul></ul></ul><ul><li>process 属性 </li></ul><ul><ul><li>この属性値に名前を付けると remote </li></ul></ul><ul><ul><li>local: 起動した Activitiy と同じプロセス </li></ul></ul><ul><ul><li>remote: 新しいプロセス </li></ul></ul><ul><li>細粒度のセキュリティ設定が可能 </li></ul>
  8. 8. ハンズオン
  9. 9. 流れ <ul><li>SD カードイメージを作る </li></ul><ul><li>エミュレータを SD カードをマウントして起動 </li></ul><ul><li>単純なプレーヤ </li></ul><ul><li>単純なサービス </li></ul><ul><li>単純な Notification </li></ul>
  10. 10. PATH の設定 <ul><li>Linux, Mac OS X, Cygwin </li></ul><ul><ul><li>cd $ANDROID_HOME/tools </li></ul></ul><ul><ul><li>PATH=$PATH:$PWD </li></ul></ul><ul><li>Windows </li></ul><ul><ul><li>cd %ANDROID_HOME% ools </li></ul></ul><ul><ul><li>path %path%;%cd% </li></ul></ul>
  11. 11. SD カードイメージを作る <ul><li>mksdcard <size> <file> </li></ul><ul><ul><li>サイズは K と M が指定可 </li></ul></ul><ul><ul><ul><li>例 ) 128M, 16K </li></ul></ul></ul><ul><ul><li>ファイルの拡張子は自動で付きません </li></ul></ul><ul><ul><li>エミュレータは 8M 以下の SD カードを使えません </li></ul></ul><ul><ul><li>例 ) サイズ 1G バイトでファイル名が” 1G.img” </li></ul></ul><ul><ul><ul><li>mksdcard 1024M 1G.img </li></ul></ul></ul>
  12. 12. エミュレータを起動 <ul><li>SD カードをマウントして起動する </li></ul><ul><li>例 ) ファイル名” 1G.img” のイメージを使用 </li></ul><ul><ul><li>emulator –sdcard 1G.img </li></ul></ul><ul><li>Eclipse では起動オプションに入れられる </li></ul>
  13. 13. mp3 を SD カードにコピー <ul><li>adb push <local> <remote> </li></ul><ul><li>SD カードは /sdcard にマウントされます </li></ul><ul><ul><li>例 ) SD カードに全ての mp3 をコピー </li></ul></ul><ul><ul><ul><li>adb push *.mp3 /sdcard </li></ul></ul></ul><ul><li>adb shell にて確認 </li></ul><ul><ul><li>adb shell で Linux の sh が起動します </li></ul></ul><ul><ul><li>cd /sdcard </li></ul></ul><ul><ul><li>ls –l </li></ul></ul><ul><li>mp3 がない場合、 </li></ul><ul><ul><li>/system/media/audio/ringtones </li></ul></ul>
  14. 14. MediaScanner を起動 <ul><li>MediaScanner により DB の更新 </li></ul><ul><ul><li>メディアファイルの情報が DB 化 </li></ul></ul><ul><ul><li>ホーム画面より </li></ul></ul><ul><ul><ul><li>DevTools->Media Scanner </li></ul></ul></ul><ul><li>DB は sqlite3 形式 </li></ul><ul><ul><li>/data/data/com.android.providers.media/databases/external-label.db </li></ul></ul><ul><ul><li>SDK は sqlite3 が /system/xbin にあります </li></ul></ul>
  15. 15. 最も単純な Player <ul><li>public class SimplePlayer extends Activity { </li></ul><ul><li>public void onCreate(Bundle savedInstanceState) { </li></ul><ul><li>super .onCreate(savedInstanceState); </li></ul><ul><li>Button b = new Button( this ); </li></ul><ul><li>b.setText(&quot;Play&quot;); </li></ul><ul><li>b.setOnClickListener( new OnClickListener() { </li></ul><ul><li>public void onClick(View v) { </li></ul><ul><li> MediaPlayer mp = new MediaPlayer(); </li></ul><ul><li> try { </li></ul><ul><li>mp.setDataSource(&quot;/sdcard/CrazyDream.ogg&quot;); </li></ul><ul><li>mp.prepare(); </li></ul><ul><li>mp.start(); </li></ul><ul><li> } catch (Exception e) { </li></ul><ul><li>throw new RuntimeException(e); </li></ul><ul><li> } </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>setContentView(b); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>演奏中にバックボタンを押すことで演奏が停止することを確認
  16. 16. 最も単純なサービス <ul><li>Activity は Service を起動、終了するだけ </li></ul><ul><li>詳細はソースで </li></ul>
  17. 17. 高度なサービス
  18. 18. 高度なサービス <ul><li>サービスを実行するだけでは足りない </li></ul><ul><li>サービスに処理対象や処理内容を依頼したい </li></ul><ul><li>サービスと通信する必要がある </li></ul>
  19. 19. IPC <ul><li>Interprocess Communication </li></ul><ul><li>Activity と Service は別プロセスの場合有 </li></ul><ul><ul><li>直で呼べるとは限らない </li></ul></ul><ul><ul><li>pipe? socket? 共有メモリ ? </li></ul></ul><ul><li>プロセス間通信手段の抽象化が必要 </li></ul><ul><ul><li>リモートでもローカルでも同じ手段で通信したい </li></ul></ul>
  20. 20. AIDL (1/2) <ul><li>Android Interface Definition Language </li></ul><ul><li>Activity と Service 間の Interface を定義 </li></ul><ul><ul><li>IDL は昔からあります </li></ul></ul><ul><ul><ul><li>CORBA </li></ul></ul></ul><ul><li>Java の Interface とほぼ同じです </li></ul><ul><ul><li>違いは引数に方向性があります </li></ul></ul><ul><li>Interface を用いて通常の OOP が可能です </li></ul><ul><ul><li>接続手続は非常に面倒です </li></ul></ul><ul><ul><li>一旦繋がればそれはただのインスタンス </li></ul></ul>
  21. 21. AIDL(2/2) <ul><li>拡張子 “ .aidl” </li></ul><ul><li>Eclipse ではファイル作成で行う </li></ul><ul><ul><li>保存すると即時で java にコンパイルされる </li></ul></ul><ul><li>CUI では aidl </li></ul><ul><li>方向の記述は in,out,inout </li></ul><ul><li>実装の実際は document の AIDL を </li></ul>
  22. 22. Stub <ul><li>AIDL をコンパイルした java に存在 </li></ul><ul><li>呼び出される側が継承して概念としてのサービスを実装 </li></ul><ul><ul><li>例 ) 指定された曲を演奏する </li></ul></ul><ul><li>呼び出す側は Interface として呼出に利用 </li></ul>
  23. 23. Callback <ul><li>Activity が Service に依頼するだけでは足りない </li></ul><ul><li>Service が Activity に依頼する場合がある </li></ul><ul><ul><li>例 ) 曲の再生が次に移った時に画面を更新 </li></ul></ul><ul><li>これを Callback と呼ぶ </li></ul><ul><li>実装は AIDL を用いるので変わらない </li></ul><ul><li>ただし実装場所が反対になる </li></ul>
  24. 24. Parcellable <ul><li>Acitivity と Service で class を共有したい </li></ul><ul><li>分散オブジェクト指向がしたい </li></ul><ul><li>Android は Java の Serializable を用いない </li></ul><ul><li>Parcellable を継承して自前でシリアライズ </li></ul><ul><li>使ってません >< </li></ul>
  25. 25. サービスの利用手順 startService(Bundle) bindService(ServiceConection) Interface.Stub.asInterface(IBinder) ServiceConnection.onConnect(IBinder) Service Service.registerCallback(Callback) Service.method() Callback.method() Activity Service サービスの利用 コールバックの利用 登録 取得 作成 / 実行 接続
  26. 26. MP3Player 完成版の解説
  27. 27. 注意点 <ul><li>サービスの必要性を良く考えよう </li></ul><ul><ul><li>CPU とストレージは進化している </li></ul></ul><ul><ul><li>電池は進化していない </li></ul></ul><ul><ul><li>Android は省電力を最も重視している </li></ul></ul><ul><ul><li>本当に Service が必要か? </li></ul></ul><ul><ul><li>Intent で即時起動、即時終了で良い可能性は? </li></ul></ul>
  28. 28. まとめ <ul><li>Service による常駐アプリ作成法を学んだ </li></ul><ul><li>AIDL を用いた IPC の方法を学んだ </li></ul><ul><li>以下について大体理解した </li></ul><ul><ul><li>MediaPlayer </li></ul></ul><ul><ul><li>Notification </li></ul></ul><ul><ul><li>ContentProvider </li></ul></ul>
  29. 29. 謝辞 <ul><li>アイコン提供 </li></ul><ul><ul><li>http://www.iconarchive.com/ </li></ul></ul><ul><li>写真と MP3 の提供 </li></ul><ul><ul><li>http://www.niconicommons.jp/ </li></ul></ul>

×