私はAndroidが初めてで、getApplication()
、getApplicationContext(
)、getBaseContext()
、getContext()
、およびsomeClass.this
の違いを理解しようとしています。特に、次のコード行のこれらのメソッド:
トーストを開始するとき、これらの違いは何ですか、どの場合に使用しますか?
Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
意図と同じ:
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
ToastおよびIntent、両方ともcontextへの参照が必要です。 getApplication、getApplicationContext、LoginActivity.thisおよびgetBaseContext、これらはすべてコンテキストへの参照を提供します。
今混乱しているのは、異なるコンテキストの宣言とその特定の使用法です。物事を簡単にするために、Androidフレームワークで利用可能な2種類のコンテキストをカウントする必要があります。
アプリケーションコンテキストはアプリケーションのライフサイクルに関連付けられ、アプリケーションのライフサイクル全体を通じて常に同じです。したがって、Toastを使用している場合、トーストはアプリケーション内のどこからでも上げることができるため、アプリケーションコンテキストまたはアクティビティコンテキスト(両方)を使用できます。ウィンドウに接続されていません。
Activityコンテキストはアクティビティのライフサイクルにアタッチされており、アクティビティのonDestroy()
が発生すると破棄されます。新しいアクティビティを起動する場合、アクティビティのコンテキストをIntentで使用して、新しい起動アクティビティが現在のアクティビティに接続されるようにする必要があります(アクティビティスタックに関して)。ただし、アプリケーションのコンテキストを使用して新しいアクティビティを起動することもできますが、フラグIntent.FLAG_ACTIVITY_NEW_TASK
を設定して、新しいタスクとして扱う必要があります。
今あなたのケースを参照してください:
LoginActivity.this
は、Activityクラスを拡張する独自のクラスを指しますが、基本クラス(Activity)はContextクラスも拡張するため、アクティビティコンテキストを提供するために使用できます。
getApplication()
はApplicationオブジェクトを参照しますが、ApplicationクラスはContextクラスを拡張するため、アプリケーションコンテキストを提供するために使用できます。
getApplicationContext()
は、アプリケーションコンテキストを提供します。
getBaseContext()
はアクティビティコンテキストを提供します。
ヒント:
Views
を操作する必要があるときはいつでも、Activity-Context、その他Application-Context で十分です。
Waqasの答えは非常に明確で完全ですが、this
とgetBaseContext()
、またはgetApplication()
とgetApplicationContext()
の使用の違いをさらに明確にしたいと思います。 Activity
とApplication
の両方は、Context
自体ではなく、ContextWrapper
を拡張します。
「単にすべての呼び出しを別の
Context
に委任するContext
のプロキシ実装」。
その「実際の」コンテキストは、getBaseContext()
を使用することで得られます。
したがって、this
(Activity
の場合)およびgetBaseContext()
は両方ともアクティビティコンテキストを提供しますが、
this != getBaseContext()
)およびthis
を介してコンテキストを呼び出すと、呼び出しが余分なレベルの間接参照を通過するため、わずかに効率が低下します。しかし、それが実際的な違いを生むとは思いません。同じロジックがgetApplication()
vs. getApplicationContext()
にも適用されます。
LoginActivity.this
上記の行は、明らかにコンテキストであるアクティビティです。これは、いくつかのAlertDialogsを作成するときに使用されます。
getApplication()
ここで同じように、テキスト作成メソッドにはコンテキストが必要であり、アプリケーション自体がContext
を実装します
getApplicationContext()
このContext
はアプリケーションがシャットダウンするまで存続するため、これが最も好ましい方法です。
getBaseContext()
このコンテキストは、ウィジェットとビューで使用できます。
しかし、それらはすべてContextオブジェクトを提供し、それ以外は何も提供しません。
Class.thisは、クラスがActivity getapplication()を拡張し、アプリケーションがアプリケーションコンテキストを拡張し、アプリケーションがアプリケーションコンテキストを拡張する場合に使用されます