3

私はAndroid開発にまったく慣れておらず、バインドされたサービスの概念に苦労しています

onCreateアクティビティのメソッドで サービスをアクティビティにバインドしました

startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

mConnection匿名クラスでコールバック メソッドServiceConnectionをオーバーライドしたオブジェクトですonServiceConnected

コールバックでmServiceは、(タイプ のクラス メンバーでLibraryServiceありLibraryService、 のサブクラスです) は、バインド先のオブジェクトをService参照するように設定されています。LibraryService

mService = binder.getService();

onCreate で bindService を呼び出した後、mService 参照を介して LibraryService を呼び出すことができると思いましたが、この時点ではまだ null に設定されており、onServiceConnected コールバックが実行されていないことを示しています。

mServiceLog を使用してメソッドによって生成された文字列の値を出力しようとしました。

if (mService != null) {
    Log.d(LOG_TAG, "In onCreate getLogFileName string value: " + mService.getLogFileName("pulse"));             
} else {
    Log.d(LOG_TAG, "In onCreate getLogFileName string value: null");                
}

私が述べたように-onCreateではまだnullでした。次に、同じログコードをonStartとonResumeに追加しましたが、mServiceはまだnullです

私の質問は、そのコールバックが実行されるのはいつですか? メソッドの本体内で発生する必要があると思っていましたonCreateが、明らかにそうではありません。Androidシステムによってコールバックが実行される方法/タイミングについて、いくつかのポインターが必要だと思います

mService がインスタンス化され、そのステートメントにヒットするステートメントにブレークポイントを設定したので、コールバックが実行されることはわかっています。いつ発生するのかわかりません。つまり、OK がいつmService設定されたかをどのように知ることができますか? OnServiceConnectedコールバックの本体内でのみアクセスできますか?

4

3 に答える 3

2

サービスバインディングは非同期であるため、少し同期して処理する必要があります。したがって、 bind サービスを呼び出した後、次のようなことができます

synchronized(this){
   while(mBoundInstance == null)
      this.wait();
}

onServiceConnected で:

synchronized(this){
   this.notify(); //wakes up thread: now mBoundInstance is 100% != null
}

ui がフリーズしないように、その待機を asyncTask に入れるとよいことに注意してください。

于 2012-09-07T11:24:05.217 に答える