web-dev-qa-db-ja.com

違いと、getApplication()、getApplicationContext()、getBaseContext()、およびsomeClass.thisを使用するタイミング

私は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);
115
Pheonix7

ToastおよびIntent、両方ともcontextへの参照が必要です。 getApplicationgetApplicationContextLoginActivity.thisおよびgetBaseContext、これらはすべてコンテキストへの参照を提供します。

今混乱しているのは、異なるコンテキストの宣言とその特定の使用法です。物事を簡単にするために、Androidフレームワークで利用可能な2種類のコンテキストをカウントする必要があります。

  1. アプリケーションコンテキスト
  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 で十分です。

202
waqaslam

Waqasの答えは非常に明確で完全ですが、thisgetBaseContext()、またはgetApplication()getApplicationContext()の使用の違いをさらに明確にしたいと思います。 ActivityApplicationの両方は、Context自体ではなく、ContextWrapperを拡張します。

「単にすべての呼び出しを別のContextに委任するContextのプロキシ実装」。

その「実際の」コンテキストは、getBaseContext()を使用することで得られます。

したがって、thisActivityの場合)およびgetBaseContext()は両方ともアクティビティコンテキストを提供しますが、

  • (a)同じオブジェクトを参照しない(this != getBaseContext())および
  • (b)thisを介してコンテキストを呼び出すと、呼び出しが余分なレベルの間接参照を通過するため、わずかに効率が低下します。しかし、それが実際的な違いを生むとは思いません。

同じロジックがgetApplication() vs. getApplicationContext()にも適用されます。

25
AlexR
LoginActivity.this 

上記の行は、明らかにコンテキストであるアクティビティです。これは、いくつかのAlertDialogsを作成するときに使用されます。

getApplication()

ここで同じように、テキスト作成メソッドにはコンテキストが必要であり、アプリケーション自体がContextを実装します

getApplicationContext()

このContextはアプリケーションがシャットダウンするまで存続するため、これが最も好ましい方法です。

getBaseContext()

このコンテキストは、ウィジェットとビューで使用できます。

しかし、それらはすべてContextオブジェクトを提供し、それ以外は何も提供しません。

6
ngesh

Class.thisは、クラスがActivity getapplication()を拡張し、アプリケーションがアプリケーションコンテキストを拡張し、アプリケーションがアプリケーションコンテキストを拡張する場合に使用されます