131

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

4 に答える 4

230

ToastIntentは、どちらもコンテキストへの参照を必要とします。また、 getApplicationgetApplicationContextLoginActivity.thisgetBaseContextはすべて、コンテキストへの参照を提供します。

ここで混乱するのは、さまざまなコンテキストとその特定の使用法の宣言です。簡単にするために、Androidフレームワークで使用可能な2種類のコンテキストを数える必要があります。

  1. アプリケーションコンテキスト
  2. アクティビティコンテキスト

アプリケーションコンテキストはアプリケーションのライフサイクルに関連付けられており、アプリケーションのライフサイクル全体を通じて常に同じになります。したがって、Toastを使用している場合は、アプリケーションコンテキストまたはアクティビティコンテキスト(両方)を使用できます。これは、トーストがアプリケーション内のどこからでも発生でき、ウィンドウにアタッチされていないためです。

アクティビティコンテキストはアクティビティのライフサイクルに関連付けられており、アクティビティが発生すると破棄される可能性がありますonDestroy()新しいアクティビティを起動する場合は、そのインテントでアクティビティのコンテキストを使用して、新しい起動アクティビティが現在のアクティビティに接続されるようにする必要があります(アクティビティスタックの観点から)。Intent.FLAG_ACTIVITY_NEW_TASKただし、アプリケーションのコンテキストを使用して新しいアクティビティを起動することもできますが、それを新しいタスクとして扱うために、フラグを設定する必要があります。

今あなたのケースを参照してください:

LoginActivity.thisただし、Activityクラスを拡張する独自のクラスを参照しますが、基本クラス(Activity)もContextクラスを拡張するため、アクティビティコンテキストを提供するために使用できます。

getApplication()ただし、Applicationオブジェクトを参照していますが、ApplicationクラスはContextクラスを拡張しているため、アプリケーションコンテキストを提供するために使用できます。

getApplicationContext()アプリケーションコンテキストを提供します。

getBaseContext()アクティビティコンテキストを提供します。

ヒント:操作する必要があるときはいつでも、 Activity-ContextViewsに進んで ください。そうでない場合は、Application-Contextで十分です。

于 2012-04-27T08:30:31.207 に答える
28

Waqasの答えは非常に明確で完全ですが、 vs 。 、またはthisvs.の使用の違いをさらに明確にしたいと思います。両方ともそれ自体ではなく拡張しますが、これはgetBaseContext()getApplication()getApplicationContext()ActivityApplicationContextContextWrapper

「その実装をプロキシするとContext、すべての呼び出しが別の呼び出しに委任されるだけですContext」。

その「実際の」コンテキストは、を使用して取得するものですgetBaseContext()

したがって、this(for Activity)とgetBaseContext()両方がアクティビティコンテキストを提供しますが、

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

同じ論理がgetApplication()vs.にも当てはまりますgetApplicationContext()

于 2012-11-23T07:13:34.360 に答える
6
LoginActivity.this 

上記の行は、明らかにコンテキストであるアクティビティです。これは、AlertDialogを作成するときに使用されます...一部の場所では、アクティビティコンテキストを使用する必要があります...

getApplication()

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

getApplicationContext()

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

getBaseContext()

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

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

于 2012-04-27T08:32:10.580 に答える
0

Class.thisは、クラスがアクティビティを拡張する場合に使用されますgetapplication()は、アプリケーションを参照し、アプリケーションはアプリケーションコンテキストを拡張しますgetbasecontext()アクティビティコンテキストコンテキストを参照しますアクティビティライフサイクルコンテキストを参照しますapplicationcontextはアプリのライフサイクルを参照します

于 2015-09-24T05:30:41.253 に答える