web-dev-qa-db-ja.com

アクティビティコンテキストとアプリケーションコンテキストの違い

これには困惑しています。Android 2.1-r8 SDKでこれを使用していました。

ProgressDialog.show(getApplicationContext(), ....);

そしてまた

Toast t = Toast.makeText(getApplicationContext(),....);

getApplicationContext()を使用すると、ProgressDialogToastの両方がクラッシュします....

「コンテキスト」という言葉を共有しているにもかかわらず、アクティビティコンテキストとアプリケーションコンテキストの実際の違いは何ですか?

215
t0mm13b

これらは両方とも Context のインスタンスですが、アプリケーションインスタンスはアプリケーションのライフサイクルに関連付けられ、アクティビティインスタンスはアクティビティのライフサイクルに関連付けられています。したがって、アプリケーション環境に関するさまざまな情報にアクセスできます。

getApplicationContext のドキュメントを読むと、ライフサイクルが現在のコンテキストとは別のコンテキストが必要な場合にのみこれを使用する必要があることに注意してください。これは、どちらの例にも当てはまりません。

アクティビティコンテキストには、おそらく、これらの呼び出しを完了するために必要な現在のアクティビティに関する情報が含まれています。正確なエラーメッセージを表示すると、正確に必要なものを指し示すことができる場合があります。

ただし、一般的には、正当な理由がない限り、アクティビティコンテキストを使用します。

227
Cheryl Simon

このテーブルは、さまざまなタイプのコンテキストをいつ使用するかを決定するのに非常に役立ちます。

enter image description here

  1. アプリケーションはここからアクティビティを開始できますが、新しいタスクを作成する必要があります。これは特定のユースケースに当てはまる場合がありますが、アプリケーションで非標準のバックスタック動作を作成する可能性があり、一般的に推奨されないか、良い方法とは見なされません。
  2. これは合法ですが、インフレーションは、アプリケーションで定義されているものではなく、実行中のシステムのデフォルトのテーマで行われます。
  3. Android 4.2以降で、スティッキーブロードキャストの現在の値を取得するために使用される受信者がnullの場合に許可されます。

元の記事 こちら

144
CommonSenseCode

これは明らかに、API設計の欠陥です。そもそも、アクティビティコンテキストとアプリケーションコンテキストはまったく異なるオブジェクトなので、コンテキストを使用するメソッドパラメーターは、親クラスContextを使用する代わりに、ApplicationContextまたはActivityを直接使用する必要があります。次に、ドキュメントでは、使用するコンテキストを明示的に指定するか、明示的に指定しないでください。

27
lucas

理由は、ProgressDialogは、ProgressDialogを支えるアクティビティに接続されているためです。アクティビティが破棄された後、ダイアログを残すことができないため、this(ActivityContext)を渡す必要があります。アクティビティが破壊されます。

11
user2779311

すべてを表示する画面(ボタン、ダイアログ、レイアウト...)が必要な場合、コンテキストアクティビティを使用する必要があり、すべてを表示または処理する画面(トースト、サービステレフォン、連絡先...)を必要としないと思いますアプリケーションコンテキストを使用できます

1
Dmobile

グローバルなスコープを持つContextに結び付けられたものが必要な場合は、getApplicationContext()を使用します。

アクティビティを使用する場合、新しいアクティビティインスタンスには、古いアクティビティへの暗黙的な参照を持つ参照があり、古いアクティビティはガベージコレクションできません。

0
Dhiraj Himani