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