2017-02-07 4 views
4

アクティビティがサービスをバインドする場合、onDestroyをアンバインドする必要があるということは、複数のソースから言われています。どうして?アクティビティが破壊されているので、サービスはとにかくバインドされていないようです。それが "始まった"場合 - それはとにかく問題ではありません。アクティビティによって自動起動された場合、他のユーザーがそれをバインドしていない場合は、とにかく閉じます。なぜサービスonDestroyをバインド解除するのですか?

なぜバインドを解除するのですか?

+0

「サービス」は誰に結束していますか?私はそうは思わない。サービスがn回限定されている場合、サービスは完全に停止するために約n回無制限にする必要があります。したがって、アクティビティが破棄されているときにバインドを解除しないと、サービスはどのようにアクティブバインディングを持たないのでしょうか?それは終わりを走り回ります。私が間違っているなら私を訂正してください。 – azizbekian

+0

[Additional Notes](https://developer.android.com/guide/components/bound-services.html#Additional_Notes)を参照してください – pskink

+0

@azizbekianバインダーの破壊によって自動的にアンバインドされると仮定しました。しかし、私は間違っているかもしれません。 – ispiro

答えて

6

アクティビティは、画面を回転したとき、ユーザーがロケールを変更したとき、またはデバイスが夜間モードに入るときなど、構成の変更を処理する必要があります。

フォアグラウンド動作のデフォルトの動作は、構成の変更が発生したときに、その動作が破棄されて再作成されることです。

結果として、ActivitybindService()を呼び出すことはお勧めできません。私たちは、構成の変更の前後でバインディングを変更しないでください。さもなければ、私たちのサービスは破壊され、活動と一緒に再作成されます(活動には唯一の拘束力があり、何もサービスを開始しなかったと仮定します)。

したがって、ApplicationシングルトンでbindService()を呼び出すことをお勧めします。次に、古い活動インスタンスから新しい活動インスタンスにServiceConnectionを渡すことができます。保持されているフラグメントは、unbindService()onDestroy()フラグメントに電話することができますので、アクティビティが永続的に破棄された場合(例えば、ユーザがBACKを押したときにfinish()と呼ぶ)、バインディングを解放できます。


これらのすべてを背景として、あなたの特定の懸念事項に。

最初に、破壊されたアクティビティが、それがバインドされているサービスから自動的にバインドされているとします。bindService()は、Activityで呼び出されます。これは起こる可能性がありますが、ドキュメント化された動作であることを思い出さず、開発者が頼りにしてはいけないことです。

さらに重要なことに、ほとんどの場合、ActivitybindService()を呼び出すことは適切な方法ではありません。それ以外の場合は、上記で概説した問題が発生します。 call- bindService() -on・ザApplicationパターン以下

しかし、私は Applicationシングルトンが破壊されることはありませんので、自動アンバインドのいくつかの並べ替えがあるように、これまで を期待していません。したがって、 unbindService()のどこかに電話をかけることができない場合(たとえば、保持されているフラグメントの onDestroy())、サービスがリークします。

+0

アプリケーションが破損していない場合(システムがメモリなどを必要とする場合に起こります。ユーザーはアクティビティを再び開始したいので、サービスを破棄する必要はありません。それとも私はここで何かを逃したのですか – ispiro

+0

@ispiro:「システムがメモリなどを必要とし、私が間違っていれば私を修正してください」 - AndroidはすべてのJavaオブジェクトを削除する* process *を終了します。 "サービスを破壊したくはありません" - 次にstartService()を使ってライフタイムを制御し、ユーザーにそれを止める手段を与えます。 「ここに何かが恋しい?」 - [ユーザーに積極的に価値を提供している場合にのみサービスを実行する](https://commonsware.com/blog/2014/07/27/role-services.html)。 @CommonsWareありがとうございます。 – CommonsWare

+0

(私があなたを正しく理解していれば)私にはもっと分かりやすいように思えます - いつでも(メディアプレーヤーのように)動いている必要があれば、私はそれを "始める"ことができます。私は一時的なサービスが必要な場合 - それは役に立たないので、私はそれをアンバインドします。とにかく、アクティビティからサービスを作成するという私の質問の前提は避けてください。再度、感謝します。 – ispiro

関連する問題