2

Android API のいくつかのクラスでContextは、コンストラクターにパラメーターが必要です (例: ArrayAdapterSQLiteOpenHelperまたは ) Intent。内からそのようなオブジェクトを作成する場合、Activityそれらに渡すのに適したコンテキスト インスタンスthis(アクティビティ インスタンス自体) またはアクティビティのgetApplicationContext()メソッドによって返されるオブジェクトとその理由は何ですか?

これまで、両方を使用してきましたが、結果の機能に違いは見られませんでした。経験則はありますか?

4

1 に答える 1

2

メソッドのドキュメントからgetApplicationContext()

現在のプロセスの単一のグローバルApplicationオブジェクトのコンテキストを返します。これは通常、ライフサイクルが現在のコンテキストとは別であり、現在のコンポーネントではなくプロセスのライフタイムに関連付けられているコンテキストが必要な場合にのみ使用する必要があります。

たとえば、これが{@ #registerReceiver(BroadcastReceiver、IntentFilter)}とどのように相互作用するかを考えてみましょう。

  • アクティビティコンテキストから使用される場合、レシーバーはそのアクティビティ内に登録されています。これは、アクティビティが破棄される前に登録を解除する必要があることを意味します。実際、そうしないと、フレームワークはアクティビティを削除してエラーをログに記録するため、リークされた登録をクリーンアップします。したがって、アクティビティコンテキストを使用して静的な(プロセスに対してグローバルであり、アクティビティインスタンスに関連付けられていない)レシーバーを登録すると、使用したアクティビティが破棄された時点でその登録が削除されます。

  • ここで返されたコンテキストから使用された場合、レシーバーはアプリケーションに関連付けられたグローバル状態に登録されています。したがって、登録が解除されることはありません。これは、レシーバーが特定のコンポーネントではなく静的データに関連付けられている場合に必要です。ただし、他の場所でApplicationContextを使用すると、登録解除やバインド解除などを忘れた場合に、深刻なリークが発生する可能性があります。

于 2012-05-01T16:52:05.677 に答える