My Photo

« batファイルを常に管理者権限で実行する | Main | 碧の軌跡をやった人の感想 »

October 27, 2011

Androidアプリ開発メモ032:サービス その4:バインドされたサービス

サービスについての以前の記事:
Androidアプリ開発メモ021:サービス
Androidアプリ開発メモ030:サービス その2
Androidアプリ開発メモ031:サービス その3:IntentService

バインドされたサービスとは
バインドされたサービスとは、クライアントコンポーネントがそのサービスにバインドし、双方向なやり取りが可能なサービスである。サービスのonBind()コールバックメソッドはIBinderオブジェクトを返す。IBinderオブジェクトはクライアントコンポーネントにサービスへのプログラミングインタフェースを提供する。
クライアントコンポーネントはbindService()でサービスをバインドする。その際、引数にServiceConnectionインタフェースを実装しているインスタンスを渡す。
Androidアプリ開発メモ030:サービス その2の「サービスの種類」も参照。

IBinderの提示方法
以下の3つの方法がある。

Binderクラスの拡張
ローカルサービスでのみ使用できる方法。Binderクラスを拡張したクラスのオブジェクトをonBind()で返す。
この記事ではこの方法について説明する。
メッセンジャーの使用
リモートサービスでも使用できる。
AIDLの使用
AIDL(Android インターフェイス定義言語 : Android Interface Definition Language)を利用する。 #AIDLがどういうものかは調べていない^^; マルチスレッド化など複雑なことができるが実装も複雑になるらしい。

バインドされたサービスのライフサイクル
クライアントコンポーネントでContext#bindSerivice()が呼ばれると、サービス側ではonCreate()、onBind()がシステムに呼ばれる。サービスが既に存在する場合はonBind()だけが呼ばれる。
すべてのクライアントコンポーネントがアンバインドされるとonDestroy()がシステムに呼ばれてサービスは破棄される。アンバインドにはContext#unbindService()を使う。

実装
「Binderクラスの拡張」の方法では、以下のように実装する。

  1. サービスで、以下のいずれかのを行うBinderのインスタンスを作成する。
    • クライアントが呼び出せるpublicメソッドを含める。
    • クライアントが呼び出せるpublicメソッドを持つ、現在のServiceインスタンスを返す。
    • クライアントが呼び出せるpublicメソッドを持つサービスによりホストされた別のクラスのインスタンスを返す。
  2. サービスで、BinderのインスタンスをonBind()コールバックメソッドから返す。
  3. クライアントでBinderをonServiceConnected()コールバックメソッドから受け取り、提供されたメソッドを使ってバインドされたサービスを呼び出す。

android.app.Serviceクラス
public abstract IBinder onBind(Intent intent)
サービスへのコミュニケーションチャネルを返す。クライアントがサービスにバインドしてはならない場合はnullを返す。

android.content.Contextクラス
public abstract boolean bindService(Intent service, ServiceConnection conn, int flags)
サービスに接続する。必要ならばサービスを作成する。

android.content.Contextクラス
public abstract void unbindService(ServiceConnection conn)
サービスから切断する。

bindService()はServiceConnectionを引数に取るため、クライアントコンポーネントはServiceConnectionの実装を定義してそのインスタンスを作成する必要がある。ServiceConnectionインタフェースにはonServiceConnected()とonServiceDisconnected()の2つのメソッドがある。
クライアントコンポーネントとサービスが接続されるとシステムがonServiceConnected()を呼ぶ。
クライアントコンポーネントとサービスとの接続が予期せず失われた場合(サービスがクラッシュした場合、強制終了された場合など)にシステムがonServiceDisconnected()を呼ぶ。「予期せず接続が切れた場合」に呼ばれるのであって、unbind()で接続が切れる場合にはonServiceDisconnected()は呼ばれない。

android.content.ServiceConnectionインタフェース
public abstract void onServiceConnected (ComponentName name, IBinder service) 
サービスへの接続が確立したときに呼ばれる。

android.content.ServiceConnectionインタフェース
public abstract void onServiceDisconnected (ComponentName name) 
サービスへの接続が失われたときに呼ばれる。

ApiDemoの
com.example.android.apis.app.LocalServiceActivities の静的ネストクラスBinding
com.example.android.apis.app.LocalService(「開始された」サービスも一緒に書かれている)
が参考になる。
実際のアプリケーションではLocalServiceにこのサービスの機能をクライアントコンポーネントに利用させるためのpublicメソッドを用意する。
ApiDemoの"App/Service/Local Service Binding"で「Bindign Service」ボタンを押下するとサービスが開始され、「Unbind Service」ボタンを押下するとサービスが終了する。
また、Backキーでもサービスは終了する。サービスをバインドしていたアクティビティがスタックの先頭からポップされて破棄されるので、サービスはアンバインドされて終了するのだと思う。

参考サイト:
AndroidのServiceについて - adsaria mood

« batファイルを常に管理者権限で実行する | Main | 碧の軌跡をやった人の感想 »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53099085

Listed below are links to weblogs that reference Androidアプリ開発メモ032:サービス その4:バインドされたサービス:

« batファイルを常に管理者権限で実行する | Main | 碧の軌跡をやった人の感想 »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof