Android Hacks - Hack26

786 views

Published on

「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。

http://www.oreilly.co.jp/books/9784873114569/

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

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

No notes for slide

Android Hacks - Hack26

  1. 1. ANDROID HACKS #26 サービスを使う 担当: Tatsuki Higashi Twitter : @htk16 09/19/11
  2. 2. この資料について <ul><li>この資料は下記の本をベースに勉強会で作成した資料です。 </li></ul><ul><ul><li>『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊) </li></ul></ul><ul><li>この本の紹介ページが下記にあります。 </li></ul><ul><ul><li>http://www.oreilly.co.jp/books/9784873114569/ </li></ul></ul>09/19/11
  3. 3. アジェンダ <ul><li>サービスとは </li></ul><ul><li>サービスを作成する </li></ul><ul><li>サービスを呼び出す </li></ul><ul><li>サービスに接続する </li></ul><ul><li>Hack をさらに Hack する </li></ul><ul><ul><li>サービスから Activity を呼び出す </li></ul></ul><ul><ul><li>Callback を使う </li></ul></ul>09/19/11
  4. 4. 1. サービスとは 09/19/11
  5. 5. 1. サービスとは <ul><li>サービス? </li></ul><ul><ul><li>アプリケーションコンポーネントの一つ </li></ul></ul><ul><ul><li>ユーザとのインタラクションを伴わない機能 </li></ul></ul><ul><ul><li>長時間に渡る処理を行うことも想定 </li></ul></ul><ul><ul><li>他のアプリケーションに機能群として提供することができる </li></ul></ul><ul><li>サービスに関するよくある間違い </li></ul><ul><ul><li>切り離されたプロセスではない </li></ul></ul><ul><ul><ul><li>起動したアプリケーションのプロセス内で動作する </li></ul></ul></ul><ul><ul><li>スレッドではない </li></ul></ul><ul><ul><ul><li>起動したアプリケーションの main thread で動作する </li></ul></ul></ul>09/19/11
  6. 6. 1. サービスとは <ul><li>サービス利用の流れ </li></ul><ul><ul><li>サービスの起動 (3. サービスを呼び出す) </li></ul></ul><ul><ul><li>サービスに接続 (4. サービスに接続する) </li></ul></ul><ul><ul><li>サービスのメソッドを呼び出す (4. サービスに接続する ) </li></ul></ul><ul><li>接続可能なサービス </li></ul><ul><ul><li>クライアントと同じプロセスで動作するサービス </li></ul></ul><ul><ul><ul><li>全ての public メソッドが利用可能 </li></ul></ul></ul><ul><ul><li>クライアントと異なるプロセスで動作するサービス </li></ul></ul><ul><ul><ul><li>AIDL (Android Interface Definition Language) で 指定された public メソッドのみを利用可能 </li></ul></ul></ul>09/19/11
  7. 7. 2. サービスを作成する 09/19/11
  8. 8. 2. サービスを作成する <ul><li>Service クラスの派生クラスとして作成する </li></ul><ul><ul><li>Service.onCreate </li></ul></ul><ul><ul><li>サービスが最初に作成されたときに呼ばれる </li></ul></ul><ul><ul><li>Service.onStartCommand </li></ul></ul><ul><ul><ul><li>パラメータ付きでサービスが作成されたときに呼ばれる(?) </li></ul></ul></ul><ul><ul><li>Service.onStart </li></ul></ul><ul><ul><li>サービス呼び出し元が Context.startService を </li></ul></ul><ul><ul><li>呼び出したときに呼ばれる </li></ul></ul><ul><ul><li>Service.onBind </li></ul></ul><ul><ul><ul><li>サービスに接続されたときに呼ばれる </li></ul></ul></ul><ul><ul><li>Service.onDestroy </li></ul></ul><ul><ul><ul><li>サービスが破棄されるときに呼ばれる </li></ul></ul></ul>09/19/11
  9. 9. 2. サービスを作成する 09/19/11 150 ミリ秒毎にインテントを ブロードキャストする
  10. 10. 2. サービスを作成する <ul><li>AIDL を使用したサービスの作成 </li></ul><ul><ul><li>例 : ImyService サービスの作成 </li></ul></ul><ul><ul><li>ImyService.aidl ファイルを作成 </li></ul></ul><ul><ul><li>対応する ImyService.java が生成される </li></ul></ul><ul><ul><ul><li>Binder の派生クラス ImyService.Stub が定義される </li></ul></ul></ul><ul><ul><ul><li>ImyService.Stub の派生クラスで ImyService インターフェースの メソッドを実装する </li></ul></ul></ul>09/19/11 提供するメソッド名を指定
  11. 11. 2. サービスを作成する 09/19/11 ImyService.stopService を実装 接続してきたクライアントには ImyServiceBinder を返す
  12. 12. 3. サービスを呼び出す 09/19/11
  13. 13. 3. サービスを呼び出す <ul><li>Context.startService(Intent i) </li></ul><ul><li>インテント i で表されるサービスを呼び出す(起動する) </li></ul><ul><li>Content.stopService </li></ul><ul><li>動作中のサービスを停止する </li></ul>09/19/11
  14. 14. 2. サービスを呼び出す <ul><li>サービスを終了させる </li></ul><ul><ul><li>原則的には以下のメソッドを呼ばないと終了しない </li></ul></ul><ul><ul><ul><li>Context.stopService 外部から終了させる </li></ul></ul></ul><ul><ul><ul><li>Service.stopSelf 自ら終了 </li></ul></ul></ul><ul><ul><li>メモリ不足の際に,システムに停止させられる可能性がある </li></ul></ul><ul><ul><ul><li>(メモリが空いたら?)システムによって再起動される </li></ul></ul></ul><ul><ul><ul><li>再起動に失敗,例外を投げるなどして停止した場合は 再起動は行われない </li></ul></ul></ul><ul><ul><ul><ul><li>その場合は Context.startService などで起動する </li></ul></ul></ul></ul>09/19/11
  15. 15. 3. サービスを呼び出す 09/19/11 UpdateService へのインテントを作成 UpdateService の起動
  16. 16. 4. サービスに接続する 09/19/11
  17. 17. 4. サービスに接続する <ul><li>Content.bindService(Intent service, ServiceConnection conn int flag) </li></ul><ul><ul><li>サービスへ接続する </li></ul></ul><ul><ul><li>service: 接続するサービスへのインテント </li></ul></ul><ul><ul><li>conn: サービスに接続,離脱した際の callback interface </li></ul></ul><ul><ul><ul><li>ServiceConnection.onServiceConnected(ComponentName name, IBinder binder) </li></ul></ul></ul><ul><ul><ul><ul><li>サービスに接続したときに呼ばれる </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>name: サービス名 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>binder: サービスへの接続チャネル </li></ul></ul></ul></ul></ul><ul><ul><ul><li>ServiceConnection.onServiceDisconnected(ComponentName name) </li></ul></ul></ul><ul><ul><ul><ul><li>サービスとの接続が切れたときに呼ばれる </li></ul></ul></ul></ul>09/19/11
  18. 18. 4. サービスに接続する <ul><li>Content.bindService(Intent service, ServiceConnection conn int flag) </li></ul><ul><ul><li>flag: 接続する際の動作 </li></ul></ul><ul><ul><ul><li>BIND_AUTO_CREATE: </li></ul></ul></ul><ul><ul><ul><ul><li>接続時にサービスが起動指定なければ起動させる </li></ul></ul></ul></ul><ul><ul><ul><li>BIND_DEBUG_UNBIND </li></ul></ul></ul><ul><ul><ul><li>BIND_NOT_FOREGROUND </li></ul></ul></ul>09/19/11
  19. 19. 4. サービスに接続する 09/19/11 UpdateService との接続を行う際の callback interface UpdateService への通信チャネル
  20. 20. 4. サービスに接続する 09/19/11 UpdateService.stopService を呼び出し
  21. 21. 5. Hack をさらに Hack する 09/19/11
  22. 22. 5. Hack をさらに Hack する <ul><li>申し訳ありません,ここで力尽きました </li></ul>09/19/11
  23. 23. 参考 URL <ul><li>Android Developers | Services </li></ul><ul><ul><li>http://developer.android.com/reference/android/app/Service.html </li></ul></ul><ul><li>Android Developers | Binder </li></ul><ul><ul><li>http://developer.android.com/intl/ja/reference/android/os/Binder.html </li></ul></ul>09/19/11

×