Skip to content

Instantly share code, notes, and snippets.

@myamamic
Created December 17, 2012 11:14
Show Gist options
  • Select an option

  • Save myamamic/4317523 to your computer and use it in GitHub Desktop.

Select an option

Save myamamic/4317523 to your computer and use it in GitHub Desktop.
[Android][memo] サービスとIPCまとめ
TODO:android 4.0時点の情報なので、4.1以降は要調査。
作成:2012/03/30
■メモ
・checkCallingPermission()
- AndroidManifest.xmlに書くのでユーザーに見えてしまうが、プラットフォーム署名しばり
などできる
■参考
・Service
http://developer.android.com/guide/topics/fundamentals/services.html
・バインドされたサービス
http://developer.android.com/guide/topics/fundamentals/bound-services.html
http://www.techdoctranslator.com/android/guide/services/bound-services
・Android インターフェイス定義言語 ( AIDL )
http://developer.android.com/guide/developing/tools/aidl.html
http://www.techdoctranslator.com/android/appendix/aidl
■まとめ
◇サービスのタイプ
・バインドされるサービスがよい。
・ServiceかIntentServiceかは、プロセス間通信の実装方法による。
◇プロセス間通信の実装
・同時に複数のリクエストを処理するなら、AIDL。
・キャンセル処理を疑似的に実装できるなら、Messangerがよい。
Binderの拡張 Messanger AIDL
----------------------------------------------------------------
異なるプロセスでの使用可否 × ○ ○
複数要求の同時処理 ---- × ○
双方向メッセージ ○ ○ ○
実装の面倒度 易 易 難
SDKサンプル ○ ○ ○
----------------------------------------------------------------
■調査内容
[サービスについて]
・Androidのサービスには2つのタイプがある。
1.Started
・startService()によって、アプリケーションから開始される。
・通常は、一つのことを実行し、呼び出し元に結果を返さない。
・このタイプのサービスは処理が終了したら、自分自身を停止するべき。
2.Bound
・アプリケーションがbindService()を実行した時に、アプリケーションは
サービスにbindする。
・バインドされたサービスは、サービスと対話したり、要求を送信したり、
結果を取得したり、プロセス間通信のためのクライアントサーバー
インターフェースを提供します。
・サービスが特定のアプリケーションからしか起動されない場合は、
インテントフィルターを設定しないでください。アプリケーションは
明示的にサービスを起動できます。
・サービスは新しいスレッドを作成しません。開発者がワーカースレッドを
作成するべきです。
・サービスは自動再起動されても正常に動作するようにデザインして下さい。
・プロセス間通信の呼び出しに数ミリ秒以上かかる場合は、呼び出しを
別スレッドにすべきです。
[サービスの実装について]
・サービスのクラスは2つある。
1.Service
・普通のサービスクラス。通常はこちらをextendsします。
・サービスはスレッドを作成しません。
・一度に複数の要求を処理する場合は、こちらを使用します。
ただし、マルチスレッドを考慮する必要があります。
・複数の要求を同時に処理するには、要求ごとにスレッドを作成します。
2.IntentService
・Serviceクラスのサブクラス。ワーカースレッドで全てのリクエストを
ハンドルします。
・サービスが複数のリクエストを同時に処理する必要がない場合に最適です。
・ワークキューによって、一度にひとつの要求しか渡されないので、
マルチスレッドについて気にする必要がなくなります。
[バインドされたサービスについて]
・クライアントがサービスと双方向にやり取りするために使用できる
プログラミングインターフェイスは3つある。
1.Binderクラスの拡張
・サービスがアプリケーションでプライベートで、
クライアント ( 共通のクライアント ) と同じプロセスで実行する場合に使用可能。
・アプリケーションにとってサービスが単なるバックグラウンドのワーカーで
しかないときに、このテクニックが推奨される。
・クライアントはサービス内のpublicメソッドにアクセス可能。
2.メッセンジャー
・Messengerはすべての要求を単一のスレッドにキューイングするため、
スレッドセーフなサービスを設計しなくてよい。
・IPCのもっとも簡単な方法。
3.AIDL
・サービスが複数の要求をいちどにハンドルできるようにしたい場合には、
AIDLを直接使用する。
・サービスはマルチスレッド化およびスレッドセーフな設計が必要。
・AIDLを使用すると、アプリケーションでマルチスレッドの機能が必要になり、
さらに複雑な実装になってしまう可能性があるため、AIDLを使ってバインド
されたサービスを作成すべきではありません。
→サービスがマルチスレッドで要求を処理するなら、AIDLを使用すべき。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment