2016-10-13 7 views
1

私は、getApplication()。bindService()または単にbindService()を使用するコードをActivity内に持っています。 別のものよりも好ましいものです。アクティビティにライフサイクルがあることを考慮すると、どのシナリオでアプリケーションコンテキストを使用してサービスを開始/バインドするか。startServiceを呼び出すコンテキスト

+0

この回答を確認するには、[link](http://stackoverflow.com/questions/6446221/get-context-in-a-service)、それは2つの概念についていくつかの明確化があります。 –

答えて

4

の場合は、をアクティビティのサービスにバインドする場合は、Applicationコンテキスト(getApplication())を使用してください。これは、バインディング自体が、構成変更処理の一部として(例えば、onRetainNonConfigurationInstance()を介して)処理される必要がある状態を表すためです。 1つのアクティビティー・インスタンスがバインドされる可能性がありますが、構成が変更されるまでアンバインドできません。 ActivitybindService()に使用すると、メモリリークが発生します(新しいアクティビティは、サービスにバインドされた元のアクティビティに間接参照を戻します)。

ただし、開始アクティビティからのサービスには、アクティビティにフレームワーク強制状態は含まれません。したがって、アクティビティ自体にstartService()を使用してサービスを開始するのは問題ありません。

+0

正直なところ、 'Application'コンテキストで' bindService'を呼び出す 'Activity'は見たことがなく、' bind'/'unbind'リクエストがペアになっているので、リークの可能性はありません。 – pskink

+0

@pskink:古いアクティビティからバインドを解除すると、設定変更の一環として、新しいアクティビティから再度バインドするチャンスを得る前に、サービスが停止することがあります。さて、何か他のものがサービスを実行し続けていると確信しているならば(おそらく、それは結びついていても始まって​​います)、それはおそらく問題ではありません。 – CommonsWare

関連する問題