違いとgetApplication()、getApplicationContext()、getBaseContext()およびsomeClass.thisをいつ使用するか


121

私はアンドロイドに新たなんだと私は違いを理解しようとしている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);


コンテキストとbaseContextのみを処理します。2つのコンテックスでのすべての使用法を理解したいと思います。感謝
Pheonix7

回答:


215

トーストインテント。どちらもコンテキストへの参照が必要です。そして、getApplicationgetApplicationContextLoginActivity.this、およびgetBaseContextは、すべてコンテキストへの参照を提供します。

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

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

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

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

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

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

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

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

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

ヒント:あなたが操作する必要があるたびViewsに行くその後、 活動状況、他のアプリケーション・コンテキストは十分だろう。


11
だから私がそれを正しく理解すると、someClass.this、getBaseContext、およびgetContext()はアクティビティコンテキストであり、getApplicationContext()およびgetApplication()はアプリケーションコンテキストですか?
Pheonix7 2012

コンテキストは環境についての単なる情報ですよね?
committedandroider

はい、それはアプリケーションをホストするサンドボックスのようなものです
waqaslam '20 / 11/14

@committedandroiderアクティビティコンテキストには選択したテーマの追加情報が含まれているため、コードでビューが作成されると、正しいテーマが自動的に適用されます。詳細情報については、あなたが読んでも、この
waqaslam

@waqaslamはandroid sdkクラスを指しますContext-> ContextWrapper-> 1. Application&2 .- ContextThemeWrapper> Activity; とのgetBaseContext()メソッドなContextWrapperのでgetBaseContext() offers activity context.、同様にApplication Context...そうではありませんか?
Bhuro、2016

26

Waqasによって答えは、しかし、私は、さらに使用との違い明確にしたいのですが、非常に明確かつ完全であるthisgetBaseContext()、またはgetApplication()対をgetApplicationContext()。両方ともそれ自体ActivityApplication拡張するのではなく、ContextContextWrapper

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

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

したがってthis(の場合Activity)とgetBaseContext()どちらもアクティビティコンテキストを提供しますが、

  • (a)同じオブジェクトを参照しない(this != getBaseContext())および
  • (b)呼び出しthisが間接的なレベルを超えるため、コンテキストの呼び出しは少し効率が悪くなります。しかし、それが実際的な違いをもたらすとは思えません。

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


これまでのようにgetBaseContext()懸念している、GoogleのAndroid開発者は、この提案:「getBaseContextを(使用しないでください)を、ちょうどあなたが持っているコンテキストを使用しています。」したがって、実際には、thisアクティビティに使用することをお勧めします。
ChuongPham

これはgetBaseContext私がインターネットで見つけた最も明確な説明です。ありがとう!!
q126y 2016

6
LoginActivity.this 

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

getApplication()

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

getApplicationContext()

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

getBaseContext()

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

しかし、それらはすべてContextオブジェクトのみを提供します。


トーストメッセージまたはインテントを作成するとき、getApplicationContext()を使用するのが最も正しいのに、すべて同じ効果がありますか?
Pheonix7 2012

1
@Hassan Samii:トーストの場合getApplicationContext()、あらゆる状況で使用できますがthis、アクティビティでトーストを作成するときに使用することをお勧めします。
ChuongPham

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.