getContext()
、、、、および " "getApplicationContext()
の違いは何ですか?getBaseContext()
this
これは簡単な質問ですが、基本的な違いがわかりません。可能であれば、簡単な例をいくつか挙げてください。
getContext()
、、、、および " "getApplicationContext()
の違いは何ですか?getBaseContext()
this
これは簡単な質問ですが、基本的な違いがわかりません。可能であれば、簡単な例をいくつか挙げてください。
View.getContext()
:ビューが現在実行されているコンテキストを返します。通常、現在アクティブなアクティビティです。
Activity.getApplicationContext()
:アプリケーション全体のコンテキストを返します(すべてのアクティビティが内部で実行されているプロセス)。現在のアクティビティだけでなく、アプリケーション全体のライフサイクルに関連付けられたコンテキストが必要な場合は、現在のアクティビティコンテキストの代わりにこれを使用してください。
ContextWrapper.getBaseContext()
:別のコンテキスト内からコンテキストにアクセスする必要がある場合は、ContextWrapperを使用します。そのContextWrapperの内部から参照されるコンテキストは、getBaseContext()を介してアクセスされます。
ほとんどの回答はすでにカバーgetContext()
していますgetApplicationContext()
が、getBaseContext()が説明されることはめったにありません。
この方法getBaseContext()
は、が存在する場合にのみ関係しますContextWrapper
。Androidは、以下を使用しContextWrapper
て既存のものを中心に作成されたクラスを提供します。Context
ContextWrapper wrapper = new ContextWrapper(context);
aを使用する利点は、ContextWrapper
「元のコンテキストを変更せずに動作を変更」できることです。たとえば、と呼ばれるアクティビティがある場合、次とは異なるテーマでをmyActivity
作成できます。View
myActivity
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
Context
リソースにアクセスするためのコード(例openFileInput()
、getString()
)、他のコンポーネントとの対話(例sendBroadcast()
、registerReceiver()
)、アクセス許可の要求(例checkCallingOrSelfPermission()
)、ファイルシステムの場所の解決(例)によって提供されるほとんどの機能をオーバーライドできるため、非常に強力ですgetFilesDir()
。ContextWrapper
デバイス/バージョン固有の問題を回避したり、コンテキストを必要とするビューなどのコンポーネントに1回限りのカスタマイズを適用したりするのに非常に便利です。
getBaseContext()メソッドを使用して、ContextWrapper
ラップアラウンドする「ベース」コンテキストにアクセスできます。たとえば、「ベース」コンテキストにアクセスする必要がある場合は、それが、、または:であるかどうかを確認Service
しActivity
ますApplication
。
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
または、メソッドの「ラップされていない」バージョンを呼び出す必要がある場合:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}
「コンテキストとは何か」という質問は、Androidの世界で最も難しい質問の1つです。
コンテキストは、システムリソースへのアクセス、アプリケーションの静的アセットの取得、権限の確認、UI操作の実行などを行うメソッドを定義します。本質的にContext
は、生産における神オブジェクトのアンチパターンの例です。
どの種類Context
を使用するかということになると、神オブジェクトであることを除いて、Context
サブクラスの階層ツリーがリスコフの置換原則に残酷に違反するため、非常に複雑になります。
このブログ投稿(現在はWayback Machineから)はContext
、さまざまな状況でのクラスの適用可能性を要約しようとしています。
完全を期すために、その投稿からメインテーブルをコピーしましょう。
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | Application | Activity | Service | ContentProvider | BroadcastReceiver | +----------------------------+-------------+----------+---------+-----------------+-------------------+ | Show a Dialog | NO | YES | NO | NO | NO | | Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ | | Layout Inflation | NO² | YES | NO² | NO² | NO² | | Start a Service | YES | YES | YES | YES | YES | | Bind to a Service | YES | YES | YES | YES | NO | | Send a Broadcast | YES | YES | YES | YES | YES | | Register BroadcastReceiver | YES | YES | YES | YES | NO³ | | Load Resource Values | YES | YES | YES | YES | YES | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- アプリケーションはここからアクティビティを開始できますが、新しいタスクを作成する必要があります。これは特定のユースケースに適合する場合がありますが、アプリケーションで非標準のバックスタック動作を引き起こす可能性があるため、通常は推奨されないか、適切な方法とは見なされません。
- これは合法ですが、インフレーションは、アプリケーションで定義されているものではなく、実行しているシステムのデフォルトのテーマで行われます。
- Android 4.2以降で、スティッキーブロードキャストの現在の値を取得するために使用されるレシーバーがnullの場合に許可されます。
getApplicationContext() -アプリケーションで実行されているすべてのアクティビティのコンテキストを返します。
getBaseContext() -アプリケーション内の別のコンテキストからContextにアクセスする場合は、アクセスできます。
getContext() -現在実行中のアクティビティのみのコンテキストビューを返します。
Context
Actvity
またはApplication
新しく作成されたコンポーネントに関する情報を提供します。
Context
新しく作成されたコンポーネント(アプリケーションコンテキストまたはアクティビティコンテキスト)に関連性を提供する必要があります
Activity
はのサブクラスであるため、そのアクティビティのコンテキストを取得するためにContext
使用できますthis
getApplicationContext()
これはアプリケーションレベルで使用され、すべてのアクティビティを参照します。
getContext()およびgetBaseContext()
おそらく同じです。これらは、ライブである現在のアクティビティのみを参照します。
これ
常に現在のクラスオブジェクトを参照します。
これ:現在のクラスオブジェクト
getContext():現在のライブアクティビティのコンテキストを返します
getApplicationContext():アプリケーションで実行されているすべてのアクティビティを返します
AContext
は:
getApplicationContext() -アプリケーションで実行されているすべてのアクティビティのコンテキストを返します。
getBaseContext() -アプリケーション内の別のコンテキストからコンテキストにアクセスする場合は、アクセスできます。
getContext() -現在実行中のアクティビティのみをコンテキストビューに返します。
これ-現在のクラスオブジェクトを参照します
これは現在のアクティビティクラスオブジェクトを参照し、アクティビティはコンテキストを継承するため、コンテキストまたはアクティビティを使用できる場合はこれを使用する必要があります。