1. ホーム
  2. アンドロイド

[解決済み】アクティビティコンテキストまたはアプリケーションコンテキストを呼び出すタイミングは?

2022-04-02 16:08:52

質問

この2つの文脈が何であるかについては、多くの投稿があります。しかし、私はまだそれを正しく理解できていません。

私の理解では、今のところ つまり、あるプログラマは、そのクラスのインスタンスとして this.getApplicationContext() をできるだけ頻繁に使用することで、メモリが漏れるのを防ぐことができます。これは、他の this (を取得する)。 Activity インスタンスコンテキスト)を指す Activity ユーザが携帯電話を傾けたり、アプリを終了したりするたびに破棄されています。ガベージコレクタ(GC)はこれを捕捉しないため、メモリを過剰に消費しているようです。

しかし、誰か本当に良いコーディング例を思いついてください。 this (のコンテキストを取得する)。 Activity インスタンス)、アプリケーションのコンテキストは役に立たない/間違っていることになりますか?

解決方法は?

getApplicationContext() はほとんど間違っています。 ハックボーンさん (中略)非常に明確に、あなたは だけ 使用 getApplicationContext() を知っている場合 なぜ を使用しています。 getApplicationContext() を指定し、その時だけ 必要 を使用します。 getApplicationContext() .

ぶっちゃけ、一部のプログラマは getApplicationContext() (または getBaseContext() Java の経験が乏しいためです。彼らは内部クラス (たとえば OnClickListener に対して ButtonActivity ) が必要であり Context . を使用するよりも、むしろ MyActivity.this を取得するために、外側のクラスの this を使用します。 getApplicationContext() または getBaseContext() を取得します。 Context オブジェクトを作成します。

あなたは のみ 使用 getApplicationContext() というときに 知っている が必要です。 Context 他のどんなものよりも長生きする可能性があるものに対して Context を自由に使えるようにすることです。シナリオは以下の通りです。

  • 使用方法 getApplicationContext() に紐づくものが必要な場合は Context それ自体がグローバルなスコープを持つことになります。私は getApplicationContext() で、例えば WakefulIntentService の場合、静的な WakeLock をサービスに使用します。そのため WakeLock は静的であり Context を取得するために PowerManager を使用して作成するのが最も安全です。 getApplicationContext() .

  • 使用方法 getApplicationContext() にバインドする場合 Service から Activity を渡したい場合は ServiceConnection (すなわち,バインディングのハンドル)の間の Activity インスタンスで onRetainNonConfigurationInstance() . Android は内部的にバインディングを追跡するために、これらの ServiceConnections への参照を保持し Contexts を作成し、バインディングを作成します。もし、バインディングを Activity の場合、新しい Activity への参照を持つことになります。 ServiceConnection への暗黙の参照を持ち、古い Activity と、古い Activity はガベージコレクションできない。

のカスタムサブクラスを使用する開発者もいます。 Application は、独自のグローバルデータに使用され、そのデータは getApplicationContext() . 確かにそれは可能ですね。私は静的なデータ・メンバを好みます。 一つ カスタム Application オブジェクトを作成します。私はあるアプリをカスタム Application オブジェクトを作成し、それが苦痛であることがわかりました。 ハックボーンさんもこの立場に賛同しています .

以下はその理由です。 ではなく を使用することです。 getApplicationContext() を、どこへでも。

  • それは、完全な Context のすべてをサポートします。 Activity を行う。これを使ってやろうとする様々なこと Context は失敗します。 主にGUIに関連するもの .

  • メモリリークを発生させることがあります。 Context から getApplicationContext() は、あなたが呼び出したことによって作られた何かを保持しており、あなたがそれをクリーンアップすることはありません。しかし Activity を使用すると、何かを保持している場合、一度 Activity がガベージコレクションされると、他のものもすべて洗い流されます。その Application オブジェクトはプロセスの存続期間中ずっと残ります。