どのような違いがあるgetContext()、getApplicationContext()、getBaseContext()"、およびthis「?
これは簡単な質問ですが、両者の基本的な違いを理解できません。可能であれば簡単な例を挙げてください。
どのような違いがあるgetContext()、getApplicationContext()、getBaseContext()"、およびthis「?
これは簡単な質問ですが、両者の基本的な違いを理解できません。可能であれば簡単な例を挙げてください。
回答:
View.getContext():ビューが現在実行されているコンテキストを返します。通常は、現在アクティブなアクティビティです。
Activity.getApplicationContext():アプリケーション全体のコンテキスト(すべてのアクティビティが内部で実行されているプロセス)を返します。現在のアクティビティだけでなく、アプリケーション全体のライフサイクルに関連付けられたコンテキストが必要な場合は、現在のアクティビティコンテキストの代わりにこれを使用します。
ContextWrapper.getBaseContext():別のコンテキスト内からコンテキストにアクセスする必要がある場合は、ContextWrapperを使用します。そのContextWrapperの内部から参照されるコンテキストには、getBaseContext()を介してアクセスします。
thisとgetContext()常に同じではありません。たとえば、Activityクラスでは、継承元ですがメソッドはクラスにないthisため、使用できます。@mikedroid @KCRajuActivityContextgetContext()Activity
ほとんどの回答はすでにカバー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);
ContextWrapperContextリソースへのアクセス(例:)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();
}
}
}
ContextWrapper、Androidフレームワークの開発者がこれまでに行った最悪の決定の1つだと思います。神オブジェクトのファミリー全体を作成したことに気づいたとき、正しいことを行ってコードを単一の責任にリファクタリングする代わりに、継承ツリーを深くすることでコンテキストの動作を変更できる醜いハックを追加しました。その醜い状態で悪いソフトウェア工学。私たちのためとして、開発者は、私見誰も使うべきではありませんgetBaseContext()かContextWrapper。もしそうなら-それは巨大な「コードのにおい」です。
CustomToastコードを見たいのですが。THANKS :)))
「コンテキストとは」という質問は、Androidの世界で最も難しい質問の1つです。
コンテキストは、システムリソースへのアクセス、アプリケーションの静的アセットの取得、権限の確認、UI操作の実行などを行うメソッドを定義します。本質的にContextは、生産における神のオブジェクトのアンチパターンの例です。
どの種類Contextを使用すればよいかというと、Contextサブクラスの階層ツリーが神のオブジェクトであることを除いて、リスコフの置換原理に容赦なく違反するため、非常に複雑になります。
このブログ投稿では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の場合に許可されます。これは、スティッキーブロードキャストの現在の値を取得するために使用されます。
Context についての情報を提供します ActvityまたはApplication新しく作成されたコンポーネントます。
関連 Context新しく作成されたコンポーネント(アプリケーションコンテキストかアクティビティコンテキストかにを提供必要があります
ActivityはのサブクラスなのでContext、を使用thisしてそのアクティビティのコンテキストを取得できます
getApplicationContext()
これはアプリケーションレベルで使用され、すべてのアクティビティを参照します。
getContext()およびgetBaseContext()
おそらく同じです。これらは、現在行われている現在のアクティビティのみが参照されます。
この
常に現在のクラスオブジェクトを参照します。
A Contextは: