startService() で開始し、bindService() でバインドするリモート サービスがあります。これを行うのは、ユーザーがスワイプでアクティビティを閉じた場合でも、アプリが明示的にサービスを停止するまでサービスをバックグラウンドで実行するためです。サービスの関連部分は次のとおりです。
public class TrackService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("onStartCommand","got to onStartCommand");
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.i("onBind", "got to onBind");
return trackServiceBinder;
}
}
アクティビティは次のとおりです。
public class GPSLoggerActivity extends Activity implements ServiceConnection {
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(TrackService.class.getName());
intent.setClass(getApplicationContext(), TrackService.class);
startService(intent);
Log.i("onStart", "started TrackService");
if (!getApplicationContext().bindService(intent, this, 0)) {
// close the Activity
}
Log.i("onStart", "bound to TrackService");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("onServiceConnected", "got here");
// get and use the interface from the Binder
}
}
サービスのマニフェストは次のとおりです。
<service
android:name=".TrackService"
android:process=":track_service_process"
android:stopWithTask="false"
android:label="@string/track_service_label"
android:exported="false"
android:enabled="true">
<intent-filter>
<action android:name="com.mydomain.gpslogger.TrackService" />
</intent-filter>
</service>
startService() と bindService() を介してデバッガーでこれを段階的に実行すると、すべて問題ありません。サービス内では、onStartCommand() が呼び出され、続いて onBind() が呼び出されます。アクティビティでは、onServiceConnected() が Binder で呼び出されます。ただし、デバッグしていないときは、何らかの理由で Service が onBind() メソッドを onStartCommand() メソッドの前に呼び出します。ログからの出力は次のとおりです。
11-28 23:17:01.805: I/onStart(1103): started TrackService
11-28 23:17:01.815: I/onStart(1103): bound to TrackService
11-28 23:17:01.985: I/onBind(1165): got to onBind
11-28 23:17:01.995: I/onStartCommand(1165): got to onStartCommand
アクティビティの onServiceConnected() メソッドが呼び出されることはありません。bindService() 呼び出しで BIND_AUTO_CREATE を使用しようとしましたが、効果がありませんでした。ここである種の競合状態が発生していることは明らかですが、これをおそらく 20 回実行しましたが、常に同じ順序で表示されます。Service で呼び出しの正しい順序を強制するために考えられる唯一の方法は、BroadcastReceiver を Activity に配置し、Service の onStartCommand() メソッドから Intent を送信して、bindService( を呼び出す時間であることを Activity に知らせることです。 )。それはかなり不器用に思えます...これを行うより良い方法はありますか? または、順不同の呼び出しを引き起こしている何かが欠けていますか?