これを解決する方法はわかりませんが、1つのアクティビティでstartServiceを呼び出し、すぐに次のアクティビティを開始するように呼び出します。前のアクティビティでstartServiceが呼び出されたときにbindServiceが失敗する
これが機能し、サービスが開始され、期待どおりにデータの処理が開始されます。
私は次のアクティビティに行き、onResume
に私はAsyncTask
を呼び出してサービスをバインドします。
したがって、基本的な流れは、AsyncTaskを呼び出すことです。bindService
はfalseを返すので、mConnectionは呼び出されません。
なぜ、bindService
がfalseを返すのが問題なのですか?
私がAsyncTaskにバインディングを置くのは、サービスが最初に起動する必要があるかどうかを確認するためにバインドする前にスレッドを10秒間スリープさせたためです。
また、このアクティビティの中で、onCreateメソッドでサービスを開始したので、10秒待ってからbindService
もfalseを返します。
private class BindServiceTask extends AsyncTask<Void, Void, Boolean> {
protected Boolean doInBackground(Void... params) {
return bindService(
new Intent(IMyCallback.class.getName()),
mConnection, Context.BIND_AUTO_CREATE);
}
protected void onPostExecute(Boolean b) {
if (b) {
Log.i(TAG, "onResume - binding succeeded");
Toast.makeText(mContext, "Bound to service succeeded",
Toast.LENGTH_LONG).show();
} else {
Log.i(TAG, "onResume - binding failed");
Toast.makeText(mContext, "Bound to service failed",
Toast.LENGTH_LONG).show();
}
}
}
private IMyCallback mCallback = new IMyCallback.Stub() {
@Override
public void dataChanged(double[] info) throws RemoteException {
mHandler.sendMessage(mHandler.obtainMessage(LOCATION_MSG, info));
}
};
IMyService mIRemoteService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log.i(TAG, "onServiceConnected");
mIRemoteService = IMyService.Stub.asInterface(service);
try {
Log.i(TAG, "registering callback");
mIRemoteService.registerCallback(mCallback);
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
}
public void onServiceDisconnected(ComponentName className) {
Log.e(TAG, "Service has unexpectedly disconnected");
mIRemoteService = null;
}
};
は、あなたがコールバックを作成したAPIとの接続を欠落していませんか?エラー/スタックトレースを投稿できますか? – Jonathan
@ジョナサン - エラーはありません。私がbindServiceを呼び出すと、値はfalseです。 mConnectionはコールバック関数です。bindServiceが失敗したので、それを含める必要はありませんでした。 –
bindServiceが失敗しなかった可能性が高いのは、サービスが常に完全にインスタンス化されてその呼び出しでバインドされるわけではないか、まれにしかバインドされないためです。私は、私が取り組んでいるプロジェクトからいくつかのスニペットを投稿しました。最初にAIDL Service APIを実装したとき、私は自分の髪を引き出しました。これを理解したので、他のすべてのオプションにもかかわらず、私はすべてのサービスの実装に頑強に使用します。 – Jonathan