これには困惑しています。Android 2.1-r8 SDKでこれを使用していました。
ProgressDialog.show(getApplicationContext(), ....);
そしてまた
Toast t = Toast.makeText(getApplicationContext(),....);
getApplicationContext()
を使用すると、ProgressDialog
とToast
の両方がクラッシュします....
「コンテキスト」という言葉を共有しているにもかかわらず、アクティビティコンテキストとアプリケーションコンテキストの実際の違いは何ですか?
これらは両方とも Context のインスタンスですが、アプリケーションインスタンスはアプリケーションのライフサイクルに関連付けられ、アクティビティインスタンスはアクティビティのライフサイクルに関連付けられています。したがって、アプリケーション環境に関するさまざまな情報にアクセスできます。
getApplicationContext のドキュメントを読むと、ライフサイクルが現在のコンテキストとは別のコンテキストが必要な場合にのみこれを使用する必要があることに注意してください。これは、どちらの例にも当てはまりません。
アクティビティコンテキストには、おそらく、これらの呼び出しを完了するために必要な現在のアクティビティに関する情報が含まれています。正確なエラーメッセージを表示すると、正確に必要なものを指し示すことができる場合があります。
ただし、一般的には、正当な理由がない限り、アクティビティコンテキストを使用します。
このテーブルは、さまざまなタイプのコンテキストをいつ使用するかを決定するのに非常に役立ちます。
元の記事 こちら 。
これは明らかに、API設計の欠陥です。そもそも、アクティビティコンテキストとアプリケーションコンテキストはまったく異なるオブジェクトなので、コンテキストを使用するメソッドパラメーターは、親クラスContextを使用する代わりに、ApplicationContext
またはActivity
を直接使用する必要があります。次に、ドキュメントでは、使用するコンテキストを明示的に指定するか、明示的に指定しないでください。
理由は、ProgressDialog
は、ProgressDialog
を支えるアクティビティに接続されているためです。アクティビティが破棄された後、ダイアログを残すことができないため、this
(ActivityContext)を渡す必要があります。アクティビティが破壊されます。
すべてを表示する画面(ボタン、ダイアログ、レイアウト...)が必要な場合、コンテキストアクティビティを使用する必要があり、すべてを表示または処理する画面(トースト、サービステレフォン、連絡先...)を必要としないと思いますアプリケーションコンテキストを使用できます
グローバルなスコープを持つContextに結び付けられたものが必要な場合は、getApplicationContext()を使用します。
アクティビティを使用する場合、新しいアクティビティインスタンスには、古いアクティビティへの暗黙的な参照を持つ参照があり、古いアクティビティはガベージコレクションできません。