MANARAY SPORT/VERTEC ONE Eins.1 アルミホイール 1本 オデッセイ/オデッセイハイブリッド RC系 【16×6.5J 5-114.3 INSET53 シルバー/リムDC】


 >  > MANARAY SPORT/VERTEC ONE Eins.1 アルミホイール 1本 オデッセイ/オデッセイハイブリッド RC系 【16×6.5J 5-114.3 INSET53 シルバー/リムDC】

MANARAY SPORT/VERTEC ONE Eins.1 CJ2~4系 アルミホイール 1本 オデッセイ/オデッセイハイブリッド RC系 7 【16×6.5J 5-114.3 INSET53 シルバー/リムDC】

http://developer.android.com/guide/components/bound-services.html

 

バインドされたサービスはクライアント-サーバインターフェイスでのサーバです。バインドされたサービスは(アクティビティのような)コンポーネントがサーバとのバインド、リクエストの送信、レスポンスの受信を、そしてプロセス間通信(IPC)の実行でさえも可能にします。バインドされたサービスは通常、それが別のアプリケーションコンポーネントにサーブ(奉仕)する間にのみ生存し、無期限にバックグラウンドで実行されません。

このドキュメントはあなたに、他のアプリケーションコンポーネントからサービスにバインドする方法を含む、バインドされたサービスの作成方法を示します。しかしながら 【送料無料】 185/65R14 14インチ BRANDLE-LINE ブランドルライン ボレアノ9 5.5J 5.50-14 YOKOHAMA ヨコハマ エコス ES31 サマータイヤ ホイール4本セット【YOsum18】、あなたはまた、一般的なサービスについての追加情報(サービスからノーティフィケーションを配信する、フォアグラウンドで実行させるサービスのセット等々)の為に"サービス"ドキュメントを参照すべきです。

基礎


Startedサービスへのバインド

"サービス"ドキュメントで述べたように、あなたはstartedとbound(バインドされた)の両方のサービスを作成することが出来ます。つまり、サービスはstartService()を呼ぶことによって開始されることが出来、startService()はサービスが無期限で実行することを許可し、更にクライアントがbindService()を呼ぶことによってそのサービスにバインドすることを許可します。

もしあなたがあなたのサービスをstartedかつboundにすることを許可する場合、サービスが開始済みの時、システムは全てのクライアントがアンバインドした時にそのサービスを破棄しません。その代わりに、あなたはstopSelf()またはstopService()を呼ぶことによって明示的にサービスを停止しなければなりません。

あなたは通常、onBind()またはonStartCommand()のどちらかを実装すべきですが、時にはその両方を実装する必要があります。例えば、音楽プレーヤーはそのサービスが無期限に実行し、更にバインドを提供することを許可することは便利であると気づくかもしれません。この方法では、アクティビティが何らかの音楽を再生することが出来、ユーザーがアプリケーションを去った離れた後でさえも音楽の再生が継続されます。その後、ユーザーがアプリケーションへ戻った時、アクティビティは再生の制御を再取得する為にサービスにバインドすることが出来ます。

startedサービスにバインドを追加した時のサービスのライフサイクルについてのより詳しい情報については"バインドされたサービスのライフサイクルの管理"セクションを必ず読むようにして下さい。


バインドされたサービスは他のアプリケーションがサービスにバインドし、サービスと対話することを可能にするServiceクラスの実装です。サービスとのバインドを提供するには、あなたはonBind()コールバックメソッドを実装しなければなりません。このメソッドはクライアントがサービスと対話する為に使うことが出来るプログラミングインターフェイスを定義するIBinderオブジェクトを返します。

クライアントはbindService()を呼ぶことによってサービスにバインド出来ます。バインドが行われる時、クライアントは、サービスとの接続を監視する、ServiceConnectionの実装を提供しなければなりません。bindService()メソッドは値を伴わずすぐに戻りますが、Androidシステムがクライアントとサービスの間に接続を作成する時に、クライアントがサービスと通信するために使うことが出来るIBinderを配信するために、システムはServiceConnectionのonServiceConnected()を呼びます。

一度に複数のクライアントがサービスに接続出来ます。しかしながら、システムは最初のクライアントがバインドする時にのみ、IBinderを取得するために、あなたのサービスのonBind()を呼びます。その後、システムは再びonBind()を呼ぶことなく、その同じIBinderをバインドする別のクライアント全てに配信します。

 

最後のクライアントがサービスからアンバインドされる時、システムはサービスを破棄します(サービスが更にstartService()で開始されていない限り)。

あなたがboundサービスを実装する時、最も重要な部分はonBind()コールバックメソッドが返すインターフェイスを定義することです。あなたがあなたのサービスのIBinderインターフェイスを定義出来る幾つかの異なる方法があり、以下のセクションでそれぞれの方法を論じています。

バインドされたサービスの作成



バインドを提供するサービスを作成する時、あなたはクライアントがそのサービスと対話するために使うことが出来るプログラミングインターフェイスを提供するIBinderを提供しなければなりません。あなたがインターフェイスを定義出来る三種類の方法があります:

Binderクラスの拡張


あなたのサービスがあなた自身のアプリケーションにプライベートであり(※他のアプリケーショに非公開であり)、クライアントと同じプロセスで実行される(ことが通常です)場合、あなたはBinderクラスを拡張し、onBind()でそれのインスタンスを返すことによってあなたのインターフェイスを作成すべきです。クライアントはBinderを受け取り、Binderの実装の又はそのServiceのであっても利用可能な公開メソッドへ直接アクセスする為にそれを使うことが出来ます。

これはあなたのサービスが単にあなた自身のアプリケーション用のバックグラウンドワーカーにすぎない時に好ましい方法です。あなたがこの方法でインターフェイスを作成しないであろう唯一の理由はあなたのサービスが他のアプリケーションまたは別のプロセス間で使用されるからです。


メッセンジャーの使用


あなたがあなたのインターフェイスを異なるプロセス間で動作させる必要がある場合、あなたはMessengerを用いる、サービス用のインターフェイスを作成することが出来ます。この方法では、サービスは異なるタイプのMessageオブジェクトへ対応するHandlerを定義します。このHandlerはクライアントとIBinderを共有出来、クライアントがMessageオブジェクトを使用してサービスへコマンドを送ることを可能にするMessengerの基礎(土台)です。加えて、クライアントはサービスがメッセージを送信し返すことが出来るように独自のメッセージを定義することが出来ます。

これはプロセス間通信(IPC)を実行する為の最も簡単な方法です。何故ならあなたがあなたのサービスがスレッドセーフであるように設計する必要がないように、Messengerは全てのリクエストを単一のスレッドのキュー(待ち行列)に入れるからです。

 

AIDLの使用


AIDL (Android Interface Definition Language/Androidインターフェイス定義言語)はオブジェクトをオペレーティングシステムが理解出来る基本要素へと解体し、IPCを実行する為にプロセス間でそれらを整頓する(マーシャリング?)為の作業の全てを行います。前の方法(Messengerの使用)は実際はその基底構造としてAIDLに基いています。上述したように、Messengerは単一のスレッド内に全てのクライアントのリクエストのキューを作成するので、サービスは一度に1つずつリクエストを受け取ります。しかしながら、もしあなたがあなたのサービスが同時に複数のリクエストを処理することを望むなら、あなたは直接AIDLを使うことが出来ます。この場合、あなたのサービスはマルチスレッディング処理の能力を持ち、スレッドセーフに構築されなければなりません。

直接AIDLを使うには、あなたはプログラミングインターフェイスを定義する.aidlファイルを作成しなければなりません。Android SDKツールはインターフェイスを実装し、IPCを処理する抽象クラスを生成する為にこのファイルを使用します。あなたはあなたのサービス内でこのクラスを拡張出来ます?


Note:
ほとんどのアプリケーションはバインドされたサービスを作成するためにAIDLを使うべきではありません。なぜならそれはマルチスレッディング能力を要求する可能性があり、より複雑な実装を結果として産み出し得るからです。従って、AIDLはほとんどのアプリケーションには適合せず、このドキュメントはあなたのサービスの為にAIDLを使う方法を論じません。もしあなたが直接AIDLを使う必要があることが確実である場合、AIDLドキュメントを見て下さい。

 

Binderクラスの拡張


もしあなたのサービスがローカルのアプリケーションによってのみ使用され、プロセス間で動作する必要がない場合、あなたはあなたのクライアントにサービスの公開メソッドへの直接のアクセスを提供するあなた独自のBinderクラスを実装することが出来ます。


Note:
これはクライアントとサービスが同じアプリケーション及びプロセス内にある場合(そしてこれは最も一般的です)にのみ機能します。例えば、これは アクティビティがバックグラウンドで音楽を再生している自身のサービスにバインドする必要がある音楽アプリケーションで良く機能します。

 
以下はセットアップする方法です:

1. .あなたのサービス内でいずれかの(ことが出来る?)Binderのインスタンスを作成します:

    • クライアントが呼ぶことが出来る公開メソッドを含む。
    • 現在のServiceのインスタンスを返す。そしてそのインスタンスはクライアントが呼ぶことが出来る公開メソッドを持つ。
    • またはクライアントが呼ぶことが出来る公開メソッドを持つサービスによって提供される別のクラスのインスタンスを返す。

2.onBind()コールバックメソッドからこのBinderのインスタンスを返します。

3.クライアント内でonServiceConnected()コールバックメソッドからBinderを受け取り、提供されたメソッドを使用してバインドされたサービスへの呼び出しを行います。


Note:
サービスとクライアントが同じアプリケーション内になければならない理由はクライアントが返されたオブジェクトをキャストし、適切にそのAPIを呼ぶことが出来るようにするためです? またサービスとクライアントは同じプロセス内になければなりません。何故ならこの方法はプロセス間のマーシャリングを実行しないからです。

マーシャリング【marshalling】の意味 - 国語辞書 - goo辞書
http://dictionary.goo.ne.jp/leaf/jn2/206616/m0u/
2 異なるコンピューターシステムやプログラミング言語の間で、データをやり取りできるようにするための処理。


例えば、以下はクライアントへBinderの実装を通じてサービスのメソッドへのアクセスを提供するサービスです:

public class LocalService extends Service {
 // クライアントへ与えられるBinder
 private final IBinder mBinder = new LocalBinder();
 // 乱数ジェネレータ
 private final Random mGenerator = new Random();
 // クライアントのBinder用に使われるクラス。我々はこのサービスが常にそのクライアントと
 // 同じプロセスで実行されることを知っているので、我々はIPCを扱う必要がない
 
 public class LocalBinder extends Binder {
 LocalService getService() {
 // クライアントが公開メソッドを呼び出せるようにこのLocalServiceのインスタンスを返す
 return LocalService.this;
 }
 }
 @Override
 public IBinder onBind(Intent intent) {
 return mBinder;
 }
 // クライアント用のメソッド
 public int getRandomNumber() {
 return mGenerator.nextInt(100);
 }
}

LocalBinderはクライアントがLocalServiceの現在のインスタンスを取得する為のgetService()メソッドを提供します。これはクライアントがサービスの公開メソッドを呼び出すことを可能にします。例えば、クライアントはサービスからgetRandomNumber()を呼ぶことが出来ます。

以下はボタンがクリックされた時、LocalServiceとバインドしgetRandomNumber()を呼ぶアクティビティです:

public class BindingActivity extends Activity {
 LocalService mService;
 boolean mBound = false;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 }
 @Override
 protected void onStart() {
 super.onStart();
 // LocalServiceにバインドする
 Intent intent = new Intent(this, LocalService.class);
 bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
 }
 @Override
 protected void onStop() {
 super.onStop();
 // サービスからアンバインドする
 if (mBound) {
 unbindService(mConnection);
 mBound = false;
 }
 }
 // ボタンがクリックされる時に呼ばれる(レイアウトファイル内のボタンはandroid:onClick属性を
 // 用いてこのメソッドにアタッチしています)
 public void onButtonClick(View v) {
 if (mBound) {
 // LocalServiceからメソッドを呼びます。しかしながら 【送料無料】メンズ レザー ブーツアウト パンツ カウハイド(牛革)【レザーパンツ 革パンツ CE規格パット付 ヴェルディ 皮パンツ バイク 牛皮 牛革 レザー 春 夏 秋 冬 対応 ツーリング 】VERDY *A2260BKc、もしこの呼出しがハングする可能性が
 // ある何かがあった場合、このリクエストはアクティビティのスローダウンを避ける為に別の
 // スレッドで実行すべきです。
 int num = mService.getRandomNumber();
 Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
 }
 }
 // サービスのバインディング用のコールバックを定義し、bindService()へ渡す。
 private ServiceConnection mConnection = new ServiceConnection() {
 @Override
 public void onServiceConnected(ComponentName className,
 IBinder service) {
 // 我々はLocalServiceにバインドしている、
 // IBinderにキャストしてLocalServiceインスタンスを取得します。
 LocalBinder binder = (LocalBinder) service;
 mService = binder.getService();
 mBound = true;
 }
 @Override
 public void onServiceDisconnected(ComponentName arg0) {
 mBound = false;
 }
 };
}

上記のサンプルはどのようにクライアントがServiceConnectionの実装とonServiceConnected()コールバックを使用してサービスにバインドするかを示しています。次のセクションはサービスにバインドするこの過程についてのより詳しい情報を提供します。


Note:
上記の例はサービスから明示的にアンバインドしていませんが、全てのクライアントは適切な時にアンバインドするべきです(アクティビティが一時停止する時など)。

 

更なる他のサンプルコードはApiDemos【プロミュー】送料無料【project mu】 BMW 7シリーズ EURO SPORTS Excellence ブレーキパッド 前後セット 12/09~ BMW F02 750Li YE44LocalService.javaクラスとLocalServiceActivities.javaクラスを見て下さい。

 

メッセンジャーの使用

AIDLと比較して

あなたがIPCを実行する必要がある時、あなたのインターフェイス用にMessengerを使用することは、AIDLをインターフェイスに実装することよりもより簡単です。何故なら、Messengerは全てのサービスへの呼び出しをキューに入れますが、純粋なAIDLインターフェイスはサービスへ同時リクエストを送信し、そしてそれはマルチスレッディングで処理しなければなりません。

ほとんどのアプリケーションでは、サービスはマルチスレッディングを実行する必要がないのでメッセンジャーの使用はサービスが一度に一件の呼び出しを処理することを許可します。もしあなたのサービスがマルチスレッディングであることが重要な場合はあなたはインターフェイスを定義するためにAIDLを使うべきです。


もしあなたのサービスがリモートのプロセスと通信する必要があるなら、あなたはあなたのサービスにインターフェイスを提供する為にMessengerを使うことが出来ます。この手法はあなたがAIDLを使う必要なくプロセス間通信(IPC)を実行することを可能にします。

 

以下はMessengerを使う方法の概要です:

  • サービスはクライアントからの各呼び出し用のコールバックを受け取るHandlerを実装します。

  • HandlerはMessengerオブジェクト(これはHandlerへの参照です)を作成する為に使用されます。

  • MessengerはサービスがonBind()からクライアントへ返すIBinderを作成します。

  • クライアントはMessenger(サービスのHandlerを参照する)をインスタンス化する為にIBinderを使い、そしてクライアントはサービスへMessageオブジェクトを送る為にMessengerを使います。

  • サービスは自身のHandlerで各Messageを受け取ります- 具体的に言うとhandleMessage()メソッドです。

この方法では、サービス上にクライアントが呼び出す"メソッド"がありません。その代わり プロジェクトμ タイプPS フロント左右セット ブレーキパッド オーリス ZRE186H F136 プロジェクトミュー プロミュー プロμ TYPE PS ブレーキパット【店頭受取対応商品】、クライアントはサービスが自身のHandlerで受け取る"メッセージ"(Messageオブジェクト)を配信します。

以下はサービスがMessengerインターフェイスを使う単純な例です:

public class MessengerService extends Service {
 // メッセージを表示するためのサービスへのコマンド
 static final int MSG_SAY_HELLO = 1;
 
 // クライアントから入来するメッセージのHandler
 class IncomingHandler extends Handler {
 @Override
 public void handleMessage(Message msg) {
 switch (msg.what) {
 case MSG_SAY_HELLO:
 Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
 break;
 default:
 super.handleMessage(msg);
 }
 }
 }
 // クライアントがIncomingHandlerへメッセージを送る為に我々が発行する対象?
 final Messenger mMessenger = new Messenger(new IncomingHandler());
 // サービスにバインドする時、我々はサービスへメッセージを送信する為に
 // 我々のメッセンジャーへのインターフェイスを返す
 @Override
 public IBinder onBind(Intent intent) {
 Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
 return mMessenger.getBinder();
 }
}

HandlerのhandleMessage()メソッドはサービスが入来するメッセージを受け取り、whatメンバに基いて何をするかを決定するところです。

クライアントがする必要があることはサービスによって返されたIBinderに基いたMessengerを作成し、send()を使用してメッセージを送ることだけです。例えば、以下はサービスにバインドし、サービスへMSG_SAY_HELLOメッセージを届ける単純なアクティビティです:

public class ActivityMessenger extends Activity {
 // サービスと通信するMessenger
 Messenger mService = null;
 // 我々がサービスのバインドを呼んだかどうかを指し示すフラグ
 boolean mBound;
 // サービスのメインインターフェイスと対話する為のクラス
 private ServiceConnection mConnection = new ServiceConnection() {
 public void onServiceConnected(ComponentName className, IBinder service) {
 // サービスとの接続が確立された時にこれが呼ばれ、我々にサービスと対話する為に
 // 使用出来るオブジェクトを与えます。我々はMessengerを使用してサービスと
 // 通信しているので、ここは我々が生のIBinderオブジェクトからそのクライアント
 // サイドの表現(するもの?)を取得します。
 mService = new Messenger(service);
 mBound = true;
 }
 public void onServiceDisconnected(ComponentName className) {
 // これはサービスとの接続が予期せずに切断された時に呼ばれます --
 // つまり、そのプロセスがクラッシュした。
 mService = null;
 mBound = false;
 }
 };
 public void sayHello(View v) {
 if (!mBound) return;
 // サポートされている'what'値を使用してサービスへのメッセージを作成し、送信します。
 Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
 try {
 mService.send(msg);
 } catch (RemoteException e) {
 e.printStackTrace();
 }
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 }
 @Override
 protected void onStart() {
 super.onStart();
 // サービスにバインドする
 bindService(new Intent(this, MessengerService.class), mConnection,
 Context.BIND_AUTO_CREATE);
 }
 @Override
 protected void onStop() {
 super.onStop();
 // サービスからアンバインドする
 if (mBound) {
 unbindService(mConnection);
 mBound = false;
 }
 }
}

このサンプルはサービスがクライアントへ応答出来る方法を示していないことに注意して下さい。もしあなたがサービスが応答することを望むならば、あなたは更にクライアント内にMessengerを作成する必要があります。そうすれば、クライアントがonServiceConnected()を受け取った時、Messengerはsend()メソッドのreplyToパラメータ内にクライアントのMessengerを含むMessageをサービスへ送信します。

あなたはMessengerService.java(サービス)及び MessengerServiceActivities.java(クライアント) サンプルで2通りのメッセージングを提供する方法の例を見ることが出来ます。

サービスへのバインド



アプリケーションコンポーネント(クライアント)はbindService()を呼ぶことによってサービスにバインドすることが出来ます。そうすればAndroidシステムはサービスのonBind()メソッドを呼び、それはサービスと対話する為のIBinderを返します。

バインドは非同期です。
bindService()はすぐに戻り、クライアントへIBinderを返しません。IBinderを受け取るには、クライアントはServiceConnectionのインスタンスを作成し、bindService()へそれを渡さなければなりません。ServiceConnectionはシステムがIBinderを届ける為に呼ぶコールバックメソッドを含んでいます。

Note:
アクティビティ、サービス、コンテントプロバイダのみがサービスにバインド出来ます - ブロードキャストレシーバからサービスにバインドすることは出来ません。


従って、あなたのクライアントからサービスにバインドする為に、あなたがしなければならないことは:

  1. ServiceConnectionの実装
    あなたの実装がオーバーライドしなければならない2つのコールバックメソッドは:

    onServiceConnected()
            システムはサービスのonBind()メソッドにより返されたIBinderを届ける為にこれを呼びます。

    onServiceDisconnected()
            Androidシステムは、サービスがクラッシュした又はkillされた時など、サービスへの接続が予期せずに失われた時にこれを呼びます。これはクライアントがアンバインドした時には呼ばれません。

  2. bindService()を呼び、ServiceConnectionの実装を渡します。

  3. システムがあなたのonServiceConnected()コールバックメソッドを呼ぶ時、あなたはそのインターフェイスによって定義されたメソッドを使用してそのサービスへの呼び出しをし始めることが出来ます。サービスとの接続を切断するには、unbindService()を呼びます。

  4. あなたのクライアントが破棄された時、それはサービスからアンバインドされますが、あなたはサービスが使用されていない間にサービスをシャットダウン出来るように、サービスとの対話をし終えた時またはあなたのアクティビティがpaused状態の時に常にアンバインドすべきです。(バインド及びアンバインドする適切な時は以降でより詳しく論じられます。)


例えば、以下のスニペットはBinderクラスを拡張することによって上記で作成されたサービスにクライアントを接続するので、これがしなければならないことは返されたIBinderをLocalServiceクラスへキャストし、LocalServiceのインスタンスを要求することだけです:

LocalService mService;
private ServiceConnection mConnection = new ServiceConnection() {
 // サービスとの接続が確立された時に呼ばれます
 public void onServiceConnected(ComponentName className, IBinder service) {
 // 我々は我々自身のプロセスで実行されている明示的なサービスにバインドしているので、
 // 我々はそのIBinderを具体的なクラスへキャストし、直接それにアクセス出来ます。
 LocalBinder binder = (LocalBinder) service;
 mService = binder.getService();
 mBound = true;
 }
 // サービスとの接続が予期せず切断された時に呼ばれます
 public void onServiceDisconnected(ComponentName className) {
 Log.e(TAG, "onServiceDisconnected");
 mBound = false;
 }
};

このServiceConnectionを用いて、クライアントはこれをbindService()へ渡すことによってサービスにバインドすることが出来ます。例えば:

Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
{yahoojp}jpprem01-zenjp40-wl-zd-16587