2012-04-27 4 views
97

私はアンドロイドに新たなんだと私はgetApplication()getApplicationContext(の違いを理解しようとしている)、getBaseContext()getContext()someClass.thisと特に次のコード行でこれらのメソッドを使用する場合:差getApplication()、getApplicationContext()、getBaseContext()を使用し、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); 
+0

可能な複製http://stackoverflow.com/q/1026973/741249またはhttp:// stackoverflow。com/q/6854265/741249 – THelper

+0

コンテキストとbaseContextのみを処理します。しかし、私は2つのcontexesのすべての使用法を理解したいと思います。ありがとう – Pheonix7

答えて

177

トースト意図は、両方ともコンテキストへの参照を必要とします。そしてgetApplicationgetApplicationContextLoginActivity.thisgetBaseContextは、彼らはすべてのコンテキストへの参照を提供します。

ここで混乱するのは、さまざまなコンテキストとその特定の用途の宣言です。物事を簡単にするために、Androidフレームワークで利用可能な2つのタイプのコンテキストを数えてください。

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

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

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

は、今すぐあなたの例を参照:しかし

LoginActivity.thisそのActivityクラスが、活動のコンテキストを提供するために使用することができますように、基本クラス(活動)も、Contextクラスを拡張を拡張する独自のクラスを参照します。

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

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

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

ヒント:あなたは 活動コンテキストのために行く、その後Viewsを操作する必要があるときはいつでも、他のアプリケーションコンテキストは十分だろう。

+10

私はそれを得る場合、someClass.this、getBaseContextとgetContext()は、getApplicationContext()とgetApplication()はアプリケーションのcontexesですか? – Pheonix7

+3

はい。あなたの前提は正しいです – waqaslam

+0

コンテキストは環境に関する正しい情報ですか? – committedandroider

6
LoginActivity.this 

上記の行はobeveouslyあなたには、いくつかのAlertDialogsを作成するときに、これは...いくつかの場所で、その義務あなたが使用することをアクティビティーコンテキストで使用されるコンテキスト。.. ...

ある活動でありますここ
getApplication() 

同じメイクtextメソッドは、コンテキストを必要とし、アプリケーション自体がContext

getApplicationContext() 

ティを実装しますこのContextは、アプリケーションがシャットダウンされるまで存続するため、最も好ましい方法です。 Waqasによって答えは非常に明確かつ完全である

+0

トーストメッセージやインテントを作成するときに、getApplicationContext()を使用しても同じエフェクトイベントが発生しますが、最も正しいですか? – Pheonix7

+1

@Hassan Samii:Toastでは、すべての状況で 'getApplicationContext()'を使うことができますが、Toastをアクティビティで作るときは 'this'を使うことが望ましいです。 – ChuongPham

21

getBaseContext() 

このコンテキストは、ウィジェットとビューが利用可能..です

しかし、それらのすべてがコンテキストオブジェクトと他には何を与えます..しかし、thisgetBaseContext()、またはgetApplication()getApplicationContext()を使用することの違いをさらに明確にしたいと思います。 ActivityApplication両方「は、別ContextへのコールのContextその単に委譲すべての実装のプロキシ」

ある、Context自体ない延びるが、ContextWrapper

「実際の」コンテキストは、getBaseContext()を使用して取得したものです。 thisActivity用)とgetBaseContext()の両方が活動のコンテキストを与えるものの

だから、彼らは

  • (a)は同じオブジェクト(this != getBaseContext())を参照していないと
  • (b)はthisを通じてコン​​テキストを呼び出します呼び出しが間接的に余分なレベルを通過するため、やや効率が悪くなります。しかし、それは実用的な違いになるとは思わない。

getApplication()と同じロジックがgetApplicationContext()に適用されます。あなたのクラスが使用活動 getapplicationは、()(アプリケーション、アプリケーションがアプリケーション・コンテキストを拡張し getbasecontextを参照して拡張する場合に使用

+0

「getBaseContext()」に関する限り、GoogleのAndroid開発者は「getBaseContext()を使用せず、使用しているコンテキストだけを使用してください」と提案しました。実際には、活動のために 'this'を使うことを提案しています。 – ChuongPham

+0

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

0

Class.this)アクティビティコンテキストは コンテキストがアプリのライフサイクルを参照してくださいApplicationContextのアクティビティのライフサイクルのコンテキスト を参照してください参照してください。

関連する問題