19

私の Android アプリでは、 と の両方を呼び出しstartServiceますbindService

Intent intent = new Intent(this, MyService.class);
ServiceConnection conn = new ServiceConnection() { ... }

startService(intent)
bindService(intent, conn, BIND_AUTO_CREATE);

後で、両方のunbindService andstopService` を試みます:

unbindService(conn);
stopService(intent);

ただし、への呼び出しで例外が発生しますunbindService。この呼び出しを削除すると、アプリはstopService呼び出しを介して適切に実行されるようです。

私は何か間違ったことをしていますか?通話は通話に関連付ける必要があり、通話は通話bindServiceに関連付ける必要があると考えていました。ただし、ここではそうではないようです。unbindServicestartServicestopService

4

4 に答える 4

29

stopService()のAndroidドキュメントには次のように記載されています。

停止したサービスにBIND_AUTO_CREATEが設定されたServiceConnectionオブジェクトがまだバインドされている場合、これらのバインドがすべて削除されるまで、サービスは破棄されないことに注意してください。サービスのライフサイクルの詳細については、サービスのドキュメントを参照してください。

したがって、stopService()最初に電話をかけ、次に電話をかけるとunbindService()うまくいくはずです(私にとってはうまくいきます)。

于 2011-02-20T02:29:57.747 に答える
8

私がこれで打った落とし穴:

bindServiceを呼び出したのと同じコンテキストでunbindServiceを呼び出すようにしてください。私の場合、それをバインドするために次のことを行っていました。

Context c = getApplicationContext();
c.bindService(...);

次に、バインドを解除するには、次のようにします。

unbindService(...);

バインドとバインド解除の両方が同じコンテキストを使用していることを確認すると、問題が解決しました。

于 2011-04-20T16:41:28.457 に答える
5

ここでわかるように、達成したいこととサービスをバインドする方法によって異なります。サービスを長時間参照したい場合は、startService よりも bindService を使用することをお勧めします。bindService メソッドでフラグ BIND_AUTO_CREATE が使用されている場合、必要に応じてサービスが開始されるため、startService を呼び出す必要はありません。

unBind サービスを呼び出すと、サービスへの関連付けが削除されます。サービスを明示的に停止する必要はありませんが、停止できます。ただし、unBind() を呼び出すと、いつでもサービスを停止できることに注意してください。

于 2010-08-02T07:40:42.477 に答える