1page.title=バインドされたサービス 2parent.title=サービス 3parent.link=services.html 4@jd:body 5 6 7<div id="qv-wrapper"> 8<ol id="qv"> 9<h2>本書の内容</h2> 10<ol> 11 <li><a href="#Basics">基本</a></li> 12 <li><a href="#Creating">バインドされたサービスを作成する</a> 13 <ol> 14 <li><a href="#Binder">Binder クラスを拡張する</a></li> 15 <li><a href="#Messenger">メッセンジャーを使用する</a></li> 16 </ol> 17 </li> 18 <li><a href="#Binding">サービスにバインドする</a></li> 19 <li><a href="#Lifecycle">バインドされたサービスのライフサイクルを管理する</a></li> 20</ol> 21 22<h2>キークラス</h2> 23<ol> 24 <li>{@link android.app.Service}</li> 25 <li>{@link android.content.ServiceConnection}</li> 26 <li>{@link android.os.IBinder}</li> 27</ol> 28 29<h2>サンプル</h2> 30<ol> 31 <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code 32 RemoteService}</a></li> 33 <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code 34 LocalService}</a></li> 35</ol> 36 37<h2>関連ドキュメント</h2> 38<ol> 39 <li><a href="{@docRoot}guide/components/services.html">サービス</a></li> 40</ol> 41</div> 42 43 44<p>バインドされたサービスは、クライアントサーバー インターフェースにおけるサーバーになります。バインドされたサービスでは、コンポーネント(アクティビティなど)をサービスにバインドしたり、送信を要求したり、受信を応答したり、さらにはプロセス間通信(IPC)を実行したりできるようにします。 45 46通常、バインドされたサービスは他のアプリケーション コンポーネントを提供している間だけ機能し、バックグラウンドで無期限に実行されることはありません。 47</p> 48 49<p>このドキュメントでは、他のアプリケーション コンポーネントからのサービスにバインドする方法を含む、バインドされたサービスの作成方法について説明します。 50ただし、サービスから通知を配信する方法や、フォアグラウンドでサービスを実行するよう設定する方法など、サービス全般の詳細については、「<a href="{@docRoot}guide/components/services.html">サービス</a>」のドキュメントをご覧ください。 51 52</p> 53 54 55<h2 id="Basics">基本</h2> 56 57<p>バインドされたサービスは、他のアプリケーションのバインドとやり取りを可能にする {@link android.app.Service} クラスの実装です。 58サービスのバインドを提供するには、{@link android.app.Service#onBind onBind()} コールバック メソッドを実装する必要があります。 59このメソッドでは {@link android.os.IBinder} オブジェクトが返されます。このオブジェクトはクライアントがサービスとのやり取りに使用するプログラミング インターフェースを定義します。 60 61</p> 62 63<div class="sidebox-wrapper"> 64<div class="sidebox"> 65 <h3>開始されたサービスにバインドする</h3> 66 67<p><a href="{@docRoot}guide/components/services.html">サービス</a> ドキュメントで説明されているように、開始されるサービスとバインドされるサービスの両方を作成できます。 68つまり、{@link android.content.Context#startService startService()} を呼び出して開始されるサービスは無期限に実行でき、クライアントが {@link 69android.content.Context#bindService bindService()} を呼び出してサービスにバインドできます。 70 71 72 <p>サービスの開始とバインドを許可すると、サービスが開始するとすべてのクライアントがアンバインドしても、システムによってサービスが破棄されることは<em>ありません</em>。 73代わりに、{@link android.app.Service#stopSelf stopSelf()} や {@link 74android.content.Context#stopService stopService()} を呼び出して、サービスを明示的に停止する必要があります。 75</p> 76 77<p>通常実装するのは、{@link android.app.Service#onBind onBind()} 78<em> か </em>{@link android.app.Service#onStartCommand onStartCommand()} のどちらかですが、両方の実装が必要な場合もあります。 79たとえば、音楽プレーヤーの場合はサービスを無期限に実行しつつ、バインドも提供できると便利な場合があります。 80この方法であれば、アクティビティがサービスを開始して音楽を再生し、ユーザーがアプリケーションから離れた場合も音楽を再生し続けることができます。 81次にユーザーがアプリケーションに戻ったとき、アクティビティがサービスにバインドして再生のコントロールをもう一度行えるようになります。 82</p> 83 84<p>開始されたサービスにバインドを追加する際のサービスのライフサイクルの詳細については、<a href="#Lifecycle">バインドされたサービスのライフサイクルを管理する</a>を必ずご覧ください。 85 86</p> 87</div> 88</div> 89 90<p>クライアントは、{@link android.content.Context#bindService 91bindService()} を呼び出せばサービスにバインドできます。バインドするときは、サービスとの接続を監視する {@link 92android.content.ServiceConnection} を実装する必要があります。{@link 93android.content.Context#bindService bindService()} メソッドは値なしですぐに返されますが、Android システムがクライアントとサービス間の接続を作成すると {@link 94android.content.ServiceConnection} の {@link 95android.content.ServiceConnection#onServiceConnected onServiceConnected()} が呼び出され、クライアントがサービスとの通信に使用できる {@link android.os.IBinder} が配信されます。 96 97 98</p> 99 100<p>複数のクライアントが同時にサービスに接続できます。ただし、1 つ目のクライアントのバインドの際にのみ、システムはサービスの {@link android.app.Service#onBind onBind()} メソッドを呼び出して{@link android.os.IBinder} を取得します。 101 102その後システムは {@link android.app.Service#onBind onBind()} を呼び出すことなく、同じ {@link android.os.IBinder} をバインドしたすべてのクライアントに配信します。 103</p> 104 105<p>最後のクライアントがサービスからアンバインドされると、システムはサービスを破棄します(サービスが {@link android.content.Context#startService startService()} でも開始された場合を除く)。 106</p> 107 108<p>バインドされたサービスを実装するときに最も重要なのは、{@link android.app.Service#onBind onBind()} コールバック メソッドが返すインターフェースを定義することです。 109サービスの {@link android.os.IBinder} インターフェースの定義には複数の方法があり、次のセクションではそれぞれのテクニックについて説明していきます。 110 111</p> 112 113 114 115<h2 id="Creating">バインドされたサービスを作成する</h2> 116 117<p>バインドを提供するサービスを作成するとき、クライアントがサービスとのやり取りに使用するプログラミング インターフェースを提供する {@link android.os.IBinder} を提示する必要があります。 118インターフェースを定義するには、次の 3 つの方法があります。 119</p> 120 121<dl> 122 <dt><a href="#Binder">Binder クラスを拡張する</a></dt> 123 <dd>サービスが独自のアプリケーション専用であり、クライアントと同じプロセスで実行する場合(ほとんどのケースに該当)、{@link android.os.Binder} クラスを拡張して {@link android.app.Service#onBind onBind()} からそのインスタンスを返すことでインターフェースを作成します。 124 125 126クライアントは {@link android.os.Binder} を受け取り、それを使用して {@link android.os.Binder} の実装や {@link android.app.Service} で利用できる public メソッドに直接アクセスできます。 127 128 129 <p>サービスが単にアプリケーションのバックグラウンド ワーカーである場合は、この方法が適しています。 130この方法が適していない唯一のケースは、サービスが他のアプリケーションや、別のプロセス間で使用されている場合です。 131</dd> 132 133 <dt><a href="#Messenger">メッセンジャーを使用する</a></dt> 134 <dd>別のプロセス間で動作するインターフェースが必要な場合は、{@link android.os.Messenger} を使用してサービス用のインターフェースを作成できます。 135この方法では、サービスが異なるタイプの {@link 136android.os.Message} オブジェクトに応答する {@link android.os.Handler} を定義します。 137この {@link android.os.Handler} を基本として {@link android.os.Messenger} は {@link android.os.IBinder} をクライアントと共有でき、 クライアントは {@link 138android.os.Message} オブジェクトを使用してサービスにコマンドを送信できるようになります。 139 140さらに、クライアントはサービスがメッセージを返信できるように独自の {@link android.os.Messenger} を定義できます。 141 142 <p>これは、最も簡単にプロセス間通信(IPC)を実行する方法であり、{@link 143android.os.Messenger} がすべてのリクエストを 1 つのスレッドにキューイングするため、サービスをスレッドセーフにデザインする必要がありません。 144</p> 145 </dd> 146 147 <dt>AIDL を使用する</dt> 148 <dd>AIDL(Android インターフェース定義言語)は、オブジェクトをオペーレーティングシステムが理解できるプリミティブに分解するためのすべての処理のを実行し、プロセス間でそれを整理して IPC 実行します。{@link android.os.Messenger} を使用する前の方法は、実際には AIDL を基本構造としています。 149 150 151前述したように、{@link android.os.Messenger} はすべてのクライアントの要求のキューを 1 つのスレッドに作成するため、サービスは要求を一度に受け取ります。 152ただし、サービスで複数の要求を同時に処理する場合は、AIDL を直接使用できます。 153 154その場合、サービスがマルチスレッドに対応しており、スレッドセーフで構築されている必要があります。 155 <p>AIDL を直接使用するには、プログラミング インターフェースを定義する {@code .aidl} ファイルを作成する必要があります。 156Android SDK ツールはこのファイルを使用して、インターフェースを実装して IPC を処理する抽象クラスを生成し、それをサービス内に拡張できます。 157 158</p> 159 </dd> 160</dl> 161 162 <p class="note"><strong>注:</strong> ほとんどのアプリケーションにおいて、マルチスレッド化が必要な点や、結果的により複雑な実装となってしまうことから、AIDL を使ったバインドされたサービスの作成は<strong>お勧めしません</strong>。 163 164AIDL はほとんどのアプリケーションに適していないため、このドキュメントではサービスでの AIDL の使用方法については取り上げません。 165どうしても AIDL の直接使用が必要な場合は、「<a href="{@docRoot}guide/components/aidl.html">AIDL</a>」のドキュメントをご覧ください。 166 167</p> 168 169 170 171 172<h3 id="Binder">Binder クラスを拡張する</h3> 173 174<p>サービスがローカルのアプリケーションでのみ使用されていて、プロセス間での作業が必要ない場合は、クライアントがサービスの public メソッドに直接アクセスできるようにする独自の {@link android.os.Binder} クラスを実装できます。 175 176</p> 177 178<p class="note"><strong>注:</strong> この方法は、クライアントとサービスが同じアプリケーションとプロセスにある場合(最も一般的なケース)のみ使用できます。 179たとえば、バックグラウンドで音楽を再生する独自のサービスに、アクティビティをバインドする必要のある音楽アプリケーションに適しています。 180 181</p> 182 183<p>セットアップ方法は次のとおりです。</p> 184<ol> 185 <li>サービスで次のいずれかに該当する {@link android.os.Binder} のインスタンスを作成します。 186 <ul> 187 <li>クライアントが呼び出せる public メソッドを含んでいる</li> 188 <li>クライアントが呼び出せる public メソッドのある現在の {@link android.app.Service} インスタンスを返す 189</li> 190 <li>クライアントが呼び出せる public メソッドのあるサービスでホストされた他のクラスのインスタンスを返す 191</li> 192 </ul> 193 <li>{@link android.os.Binder} のインスタンスを {@link 194android.app.Service#onBind onBind()} コールバック メソッドから返します。</li> 195 <li>クライアントで、{@link android.os.Binder} を {@link 196android.content.ServiceConnection#onServiceConnected onServiceConnected()} コールバック メソッドから受け取り、提供されたメソッドを使用してバインドされたサービスを呼び出します。 197</li> 198</ol> 199 200<p class="note"><strong>注:</strong> サービスとクライアントが同じアプリケーションになければならない理由は、クライアントが返されたオブジェクトをキャストでき、その API を適切に呼び出せるようにするためです。 201また、サービスとクライアントが同じプロセスになければならない理由は、この方法ではプロセス間の整理が一切行われないためです。 202 203</p> 204 205<p>以下は、{@link android.os.Binder} の実装を介してサービスのメソッドにクライアントアクセスを提供するサービスの例です。 206</p> 207 208<pre> 209public class LocalService extends Service { 210 // Binder given to clients 211 private final IBinder mBinder = new LocalBinder(); 212 // Random number generator 213 private final Random mGenerator = new Random(); 214 215 /** 216 * Class used for the client Binder. Because we know this service always 217 * runs in the same process as its clients, we don't need to deal with IPC. 218 */ 219 public class LocalBinder extends Binder { 220 LocalService getService() { 221 // Return this instance of LocalService so clients can call public methods 222 return LocalService.this; 223 } 224 } 225 226 @Override 227 public IBinder onBind(Intent intent) { 228 return mBinder; 229 } 230 231 /** method for clients */ 232 public int getRandomNumber() { 233 return mGenerator.nextInt(100); 234 } 235} 236</pre> 237 238<p>{@code LocalBinder} が {@code LocalService} の現在のインスタンスを取り出すための {@code getService()}メソッドをクライアントに提供します。 239これにより、クライアントがサービス内の public メソッドを呼び出せるようになります。 240たとえば、クライアントはサービスから {@code getRandomNumber()} を呼び出すことができます。</p> 241 242<p>以下は、{@code LocalService} にバインドして、ボタンがクリックされたときに {@code getRandomNumber()} を呼び出すアクティビティの例です。 243</p> 244 245<pre> 246public class BindingActivity extends Activity { 247 LocalService mService; 248 boolean mBound = false; 249 250 @Override 251 protected void onCreate(Bundle savedInstanceState) { 252 super.onCreate(savedInstanceState); 253 setContentView(R.layout.main); 254 } 255 256 @Override 257 protected void onStart() { 258 super.onStart(); 259 // Bind to LocalService 260 Intent intent = new Intent(this, LocalService.class); 261 bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 262 } 263 264 @Override 265 protected void onStop() { 266 super.onStop(); 267 // Unbind from the service 268 if (mBound) { 269 unbindService(mConnection); 270 mBound = false; 271 } 272 } 273 274 /** Called when a button is clicked (the button in the layout file attaches to 275 * this method with the android:onClick attribute) */ 276 public void onButtonClick(View v) { 277 if (mBound) { 278 // Call a method from the LocalService. 279 // However, if this call were something that might hang, then this request should 280 // occur in a separate thread to avoid slowing down the activity performance. 281 int num = mService.getRandomNumber(); 282 Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); 283 } 284 } 285 286 /** Defines callbacks for service binding, passed to bindService() */ 287 private ServiceConnection mConnection = new ServiceConnection() { 288 289 @Override 290 public void onServiceConnected(ComponentName className, 291 IBinder service) { 292 // We've bound to LocalService, cast the IBinder and get LocalService instance 293 LocalBinder binder = (LocalBinder) service; 294 mService = binder.getService(); 295 mBound = true; 296 } 297 298 @Override 299 public void onServiceDisconnected(ComponentName arg0) { 300 mBound = false; 301 } 302 }; 303} 304</pre> 305 306<p>上の例は、{@link android.content.ServiceConnection} の実装と {@link 307android.content.ServiceConnection#onServiceConnected onServiceConnected()} コールバックを使用してクライアントがサービスにバインドする方法を示しています。 308次のセクションでは、サービスへのバインドのプロセスについて詳しく説明していきます。 309</p> 310 311<p class="note"><strong>注:</strong> 上記の例ではサービスから明示的にアンバウンドしていませんが、すべてのクライアントは適切なタイミング(アクティビティが一時停止したときなど)でアンバウンドする必要があります。 312</p> 313 314<p>他のサンプル コードについては、<a href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a> の <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code 315LocalService.java}</a> クラスと <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.html">{@code 316LocalServiceActivities.java}</a> クラスをご覧ください。</p> 317 318 319 320 321 322<h3 id="Messenger">メッセンジャーを使用する</h3> 323 324<div class="sidebox-wrapper"> 325<div class="sidebox"> 326 <h4>AIDL との比較</h4> 327 <p>IPC を実行する必要がある場合、インターフェースで {@link android.os.Messenger} を使う方が AIDL で実装するよりも簡単です。{@link android.os.Messenger} がすべての呼び出しをサービスにキューイングするのに対して、純粋な AIDL インターフェースでは同時に複数の要求をサービスに送るため、マルチスレッドの処理が必要になるためです。 328 329 330</p> 331 <p>ほとんどのアプリケーションにおいて、サービスはマルチスレッドを実行する必要がないため、{@link 332android.os.Messenger} を使用することでサービスが一度に 1 つの呼び出しを処理できます。サービスのマルチスレッド化が重視されている場合は、<a href="{@docRoot}guide/components/aidl.html">AIDL</a> を使用してインターフェースを定義してください。 333</p> 334</div> 335</div> 336 337<p>リモート プロセスと通信するサービスが必要な場合は、{@link android.os.Messenger} を使用してサービスのインターフェースを提供できます。 338この方法では、AIDL を使用する必要なくプロセス間通信(IPC)を実行できます。 339</p> 340 341<p>{@link android.os.Messenger} の使用方法の概要は以下のとおりです。</p> 342 343<ul> 344 <li>クライアントからの呼び出しごとにコールバックを受け取る{@link android.os.Handler} をサービスが実装します。 345</li> 346 <li>{@link android.os.Handler} を使用して {@link android.os.Messenger} オブジェクトを作成します( 347{@link android.os.Handler} への参照になります)。</li> 348 <li>{@link android.os.Messenger} が、サービスが {@link android.app.Service#onBind onBind()} からクライアントに返す {@link android.os.IBinder} を作成します。 349</li> 350 <li>クライアントが {@link android.os.IBinder} を使用して、(サービスの {@link android.os.Handler} を参照する){@link android.os.Messenger} をインスタンス化し、これを使用してクライアントが {@link android.os.Message} オブジェクトをサービスに送ります。 351 352</li> 353 <li>サービスが {@link 354android.os.Handler}、具体的には、{@link android.os.Handler#handleMessage 355handleMessage()} メソッドで、それぞれの {@link android.os.Message} を受け取ります。—</li> 356</ul> 357 358 359<p>この方法には、クライアントがサービスで呼び出す「メソッド」はありません。代わりに、クライアントはサービスが {@link android.os.Handler} で受け取る「メッセージ({@link android.os.Message} オブジェクト)」を配信します。 360 361</p> 362 363<p>以下は、{@link android.os.Messenger} インターフェースを使用するサービスの簡単な例です。</p> 364 365<pre> 366public class MessengerService extends Service { 367 /** Command to the service to display a message */ 368 static final int MSG_SAY_HELLO = 1; 369 370 /** 371 * Handler of incoming messages from clients. 372 */ 373 class IncomingHandler extends Handler { 374 @Override 375 public void handleMessage(Message msg) { 376 switch (msg.what) { 377 case MSG_SAY_HELLO: 378 Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); 379 break; 380 default: 381 super.handleMessage(msg); 382 } 383 } 384 } 385 386 /** 387 * Target we publish for clients to send messages to IncomingHandler. 388 */ 389 final Messenger mMessenger = new Messenger(new IncomingHandler()); 390 391 /** 392 * When binding to the service, we return an interface to our messenger 393 * for sending messages to the service. 394 */ 395 @Override 396 public IBinder onBind(Intent intent) { 397 Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); 398 return mMessenger.getBinder(); 399 } 400} 401</pre> 402 403<p>{@link android.os.Handler} の {@link android.os.Handler#handleMessage handleMessage()} メソッドが、サービスが {@link android.os.Message} を受け取る場所であり、{@link android.os.Message#what} メンバーに基づいてその後の操作を決める場面であることに注目してください。 404 405</p> 406 407<p>クライアントで必要な操作は、サービスから返された {@link 408android.os.IBinder} に基づいて {@link android.os.Messenger} を作成し、{@link 409android.os.Messenger#send send()} を使用してメッセージを送信するだけです。例として、サービスにバインドして {@code MSG_SAY_HELLO} メッセージをサービスに送信する簡単なアクティビティを次に示します。 410</p> 411 412<pre> 413public class ActivityMessenger extends Activity { 414 /** Messenger for communicating with the service. */ 415 Messenger mService = null; 416 417 /** Flag indicating whether we have called bind on the service. */ 418 boolean mBound; 419 420 /** 421 * Class for interacting with the main interface of the service. 422 */ 423 private ServiceConnection mConnection = new ServiceConnection() { 424 public void onServiceConnected(ComponentName className, IBinder service) { 425 // This is called when the connection with the service has been 426 // established, giving us the object we can use to 427 // interact with the service. We are communicating with the 428 // service using a Messenger, so here we get a client-side 429 // representation of that from the raw IBinder object. 430 mService = new Messenger(service); 431 mBound = true; 432 } 433 434 public void onServiceDisconnected(ComponentName className) { 435 // This is called when the connection with the service has been 436 // unexpectedly disconnected -- that is, its process crashed. 437 mService = null; 438 mBound = false; 439 } 440 }; 441 442 public void sayHello(View v) { 443 if (!mBound) return; 444 // Create and send a message to the service, using a supported 'what' value 445 Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0); 446 try { 447 mService.send(msg); 448 } catch (RemoteException e) { 449 e.printStackTrace(); 450 } 451 } 452 453 @Override 454 protected void onCreate(Bundle savedInstanceState) { 455 super.onCreate(savedInstanceState); 456 setContentView(R.layout.main); 457 } 458 459 @Override 460 protected void onStart() { 461 super.onStart(); 462 // Bind to the service 463 bindService(new Intent(this, MessengerService.class), mConnection, 464 Context.BIND_AUTO_CREATE); 465 } 466 467 @Override 468 protected void onStop() { 469 super.onStop(); 470 // Unbind from the service 471 if (mBound) { 472 unbindService(mConnection); 473 mBound = false; 474 } 475 } 476} 477</pre> 478 479<p>この例では、サービスがクライアントにどのように応答できるのかは示されていません。サービスが応答するようにするには、クライアントで {@link android.os.Messenger} も作成する必要があります。 480その後、クライアントが {@link android.content.ServiceConnection#onServiceConnected 481onServiceConnected()} コールバックを受け取るとき、{@link android.os.Messenger#send send()} メソッドの {@link android.os.Message#replyTo} パラメータにクライアントの{@link android.os.Messenger} を含めてサービスに {@link android.os.Message} を送信します。 482 483 484</p> 485 486<p>双方向メッセージを提供する方法のサンプルについては、<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html">{@code 487MessengerService.java}</a>(サービス)と <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.html">{@code 488MessengerServiceActivities.java}</a>(クライアント)のサンプルをご覧ください。</p> 489 490 491 492 493 494<h2 id="Binding">サービスにバインドする</h2> 495 496<p>アプリケーションのコンポーネント(クライアント)は、{@link android.content.Context#bindService bindService()} を呼び出してサービスにバインドできます。 497次に Android システムがサービスの {@link android.app.Service#onBind 498onBind()} メソッドを呼び出し、そこからサービスとのやり取りに必要な {@link android.os.IBinder} が返されます。 499</p> 500 501<p>バインドは非同期的に行われます。{@link android.content.Context#bindService 502bindService()} は瞬時に返され、{@link android.os.IBinder} はクライアントには<em>返されません</em>。 503{@link android.os.IBinder} を受け取るには、クライアントが {@link 504android.content.ServiceConnection} のインスタンスを作成し、それを {@link android.content.Context#bindService 505bindService()} に渡す必要があります。{@link android.content.ServiceConnection} にはシステムが {@link android.os.IBinder} の配信用に呼び出すコールバック メソッドが含まれています。 506</p> 507 508<p class="note"><strong>注:</strong> サービスにバインドできるのは、アクティビティ、サービス、コンテンツ プロバイダのみです。ブロードキャスト レシーバーからサードパーティビスにはバインド<strong>できません</strong>。 509—</p> 510 511<p>そのため、クライアントからサービスにバインドするには次の操作が必要です。 </p> 512<ol> 513 <li>{@link android.content.ServiceConnection} を実装する。 514 <p>実装では次の 2 つのコールバック メソッドをオーバーライドする必要があります。</p> 515 <dl> 516 <dt>{@link android.content.ServiceConnection#onServiceConnected onServiceConnected()}</dt> 517 <dd>システムがこれを呼び出して、サービスの {@link android.app.Service#onBind onBind()} メソッドから返された {@link android.os.IBinder} を配信します。 518</dd> 519 <dt>{@link android.content.ServiceConnection#onServiceDisconnected 520onServiceDisconnected()}</dt> 521 <dd>サービスがクラッシュしたり強制終了されたりした場合など、サービスへの接続が予期せず失われたときに、Android システムがこれを呼び出します。 522これは、クライアントのアンバウンドの際には<em>呼び出されません</em>。 523</dd> 524 </dl> 525 </li> 526 <li>{@link 527android.content.Context#bindService bindService()} を呼び出して、{@link 528android.content.ServiceConnection} の実装を渡します。 </li> 529 <li>システムが {@link android.content.ServiceConnection#onServiceConnected 530onServiceConnected()} コールバック メソッドを呼び出すと、インターフェースで定義されたメソッドを使用してサービスへの呼び出しを開始できます。 531</li> 532 <li>サービスとの接続を切断するには、{@link 533android.content.Context#unbindService unbindService()} を呼び出します。 534 <p>クライアントが破棄されたときにはサービスからアンバウンドしますが、サービスが使用されていないときはシャットダウンできるよう、サービスとのやり取りが終了したときや、アクティビティが停止したときは常にアンバウンドする必要があります 535 536(バインドとアンバインドの適切なタイミングについては後半でさらに詳しく説明します)。 537</p> 538 </li> 539</ol> 540 541<p>たとえば、次のスニペットは <a href="#Binder"> Binder クラスを拡張</a>して先ほど作成したサービスにクライアントを接続しており、返された {@link android.os.IBinder} を {@code LocalService} クラスにキャストして、{@code 542LocalService} インスタンスを要求することだけが必要になります。 543 544</p> 545 546<pre> 547LocalService mService; 548private ServiceConnection mConnection = new ServiceConnection() { 549 // Called when the connection with the service is established 550 public void onServiceConnected(ComponentName className, IBinder service) { 551 // Because we have bound to an explicit 552 // service that is running in our own process, we can 553 // cast its IBinder to a concrete class and directly access it. 554 LocalBinder binder = (LocalBinder) service; 555 mService = binder.getService(); 556 mBound = true; 557 } 558 559 // Called when the connection with the service disconnects unexpectedly 560 public void onServiceDisconnected(ComponentName className) { 561 Log.e(TAG, "onServiceDisconnected"); 562 mBound = false; 563 } 564}; 565</pre> 566 567<p>この {@link android.content.ServiceConnection} を使用して、クライアントは {@link android.content.Context#bindService bindService()} に渡すことでサービスにバインドできます。 568次に例を示します。</p> 569 570<pre> 571Intent intent = new Intent(this, LocalService.class); 572bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 573</pre> 574 575<ul> 576 <li>{@link android.content.Context#bindService bindService()} の最初のパラメータは、バインドするサービス名を明示的に指定する {@link android.content.Intent} です(インテントは暗黙的である場合があります)。 577 578</li> 579<li>2 つ目のパラメータは {@link android.content.ServiceConnection} オブジェクトです。</li> 580<li>3 つ目のパラメータはバインドのオプションを示すフラグです。通常は {@link 581android.content.Context#BIND_AUTO_CREATE} でサービスがまだ存在していない場合にサービスを作成します。他の有効な値は、{@link android.content.Context#BIND_DEBUG_UNBIND} と {@link android.content.Context#BIND_NOT_FOREGROUND} か、未指定の {@code 0} です。 582 583</li> 584</ul> 585 586 587<h3>その他の注意点</h3> 588 589<p>サービスへのバインドに関する重要な注意点は次のとおりです。</p> 590<ul> 591 <li>接続が切れたときに投げられる {@link android.os.DeadObjectException} 例外は、常に処理する必要があります。 592リモート メソッドから投げられる例外はこれのみです。</li> 593 <li>オブジェクトはプロセス間で有効な参照です。 </li> 594 <li>通常は、クライアントのライフサイクルの立ち上がりと終了のタイミングに合わせて、その間でバインドとアンバインドをペア設定します。 595次に例を示します。 596 <ul> 597 <li>アクティビティが見えている間のみサービスとやり取りする必要がある場合は、 598{@link android.app.Activity#onStart onStart()} の間にバインドし、{@link 599android.app.Activity#onStop onStop()} の間にアンバインドします。</li> 600 <li>アクティビティがバックグラウンドで停止している間も応答を受け取りたい場合は、{@link android.app.Activity#onCreate onCreate()} の間にバインドし、{@link android.app.Activity#onDestroy onDestroy()} の間にアンバインドします。 601 602つまり、アクティビティの実行中は(バックグラウンドも含む)常にサービスを使用する必要があるため、サービスが別のプロセスにある場合は、プロセスの重みを上げて、システムに強制終了させやすいようにします。 603 604 605</li> 606 </ul> 607 <p class="note"><strong>注:</strong> 通常、アクティビティの {@link android.app.Activity#onResume onResume()} と {@link 608android.app.Activity#onPause onPause()} の間にはバインドとアンバインドは<strong>行いません</strong>。これは、これらのコールバックがライフサイクルの遷移すべてで発生するため、その遷移で発生するプロセスを最小限に抑える必要があるためです。 609 610また、アプリケーションの複数のアクティビティが同一サービスにバインドしていて、そのなかの 2 つのアクティビティ間の遷移が生じる場合、現在のアクティビティは次のアクティビティがバインドする(再開中)前にアンバインドされる(停止中)ため、サービスが破棄されて再作成される場合があります 611 612 613(ライフサイクルと連携したアクティビティの遷移の詳細については、「<a href="{@docRoot}guide/components/activities.html#CoordinatingActivities">Activities</a>」のドキュメントをご覧ください)。 614 615</p> 616</ul> 617 618<p>他のサンプル コードについては、 <a href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a> の <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code 619RemoteService.java}</a> クラスをご覧ください。</p> 620 621 622 623 624 625<h2 id="Lifecycle">バインドされたサービスのライフサイクルを管理する</h2> 626 627<p>サービスがすべてのクライアントからアンバインドされると、Android システムがそれを破棄します({@link android.app.Service#onStartCommand onStartCommand()} でも開始された場合を除く)。 628純粋にバインドされたサービスであれば、サービスのライフサイクルを管理する必要はありません。サービスがクライアントにバインドされているかどうかに基づいて Android システムがそれを管理します。 629 630—</p> 631 632<p>ただし、{@link android.app.Service#onStartCommand 633onStartCommand()} コールバック メソッドを実装する場合は、サービスは <em>開始された</em>とみなされるため、明示的に停止する必要があります。 634この場合、クライアントにバインドされているかどうかにかかわらず、サービスが {@link android.app.Service#stopSelf()} で自ら停止するまで、または他のコンポーネントが {@link 635android.content.Context#stopService stopService()} を呼び出すまで実行し続けます。 636 637</p> 638 639<p>さらに、サービスが開始されてバインドを許可する場合、システムが {@link android.app.Service#onUnbind onUnbind()} メソッドを呼び出すとき、次回クライアントがサービスにバインドするときに {@link android.app.Service#onRebind 640onRebind()} への呼び出しを受け取りたい場合は、{@code true} を返すようにすることもできます({@link 641android.app.Service#onBind onBind()} への呼び出しを受け取る代わりに)。{@link android.app.Service#onRebind 642onRebind()} からは void が返されますが、クライアントは {@link android.content.ServiceConnection#onServiceConnected onServiceConnected()} コールバックで {@link android.os.IBinder} を受け取ります。下の図 1 は、ライフサイクルのこの種の論理を表しています。 643 644 645 646</p> 647 648 649<img src="{@docRoot}images/fundamentals/service_binding_tree_lifecycle.png" alt="" /> 650<p class="img-caption"><strong>図 1.</strong> 開始されたサービスでバインドを許可するサービスのライフサイクル 651</p> 652 653 654<p>開始されたサービスのライフサイクルの詳細については、「<a href="{@docRoot}guide/components/services.html#Lifecycle">サービス</a>」のドキュメントをご覧ください。</p> 655 656 657 658 659