628

getContext()、、、、および " "getApplicationContext()の違いは何ですか?getBaseContext()this

これは簡単な質問ですが、基本的な違いがわかりません。可能であれば、簡単な例をいくつか挙げてください。

4

10 に答える 10

578
  • View.getContext():ビューが現在実行されているコンテキストを返します。通常、現在アクティブなアクティビティです。

  • Activity.getApplicationContext():アプリケーション全体のコンテキストを返します(すべてのアクティビティが内部で実行されているプロセス)。現在のアクティビティだけでなく、アプリケーション全体のライフサイクルに関連付けられたコンテキストが必要な場合は、現在のアクティビティコンテキストの代わりにこれを使用してください。

  • ContextWrapper.getBaseContext():別のコンテキスト内からコンテキストにアクセスする必要がある場合は、ContextWrapperを使用します。そのContextWrapperの内部から参照されるコンテキストは、getBaseContext()を介してアクセスされます。

于 2012-05-17T18:15:25.737 に答える
130

ほとんどの回答はすでにカバーgetContext()していますgetApplicationContext()が、getBaseContext()が説明されることはめったにありません。

この方法getBaseContext()は、が存在する場合にのみ関係しますContextWrapper。Androidは、以下を使用しContextWrapperて既存のものを中心に作成されたクラスを提供します。Context

ContextWrapper wrapper = new ContextWrapper(context);

aを使用する利点は、ContextWrapper「元のコンテキストを変更せずに動作を変更」できることです。たとえば、と呼ばれるアクティビティがある場合、次とは異なるテーマでをmyActivity作成できます。ViewmyActivity

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ラップアラウンドする「ベース」コンテキストにアクセスできます。たとえば、「ベース」コンテキストにアクセスする必要がある場合は、それが、、または:であるかどうかを確認ServiceActivityます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();
    }
  }
}
于 2017-02-13T18:24:07.880 に答える
43

「コンテキストとは何か」という質問は、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               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. アプリケーションはここからアクティビティを開始できますが、新しいタスクを作成する必要があります。これは特定のユースケースに適合する場合がありますが、アプリケーションで非標準のバックスタック動作を引き起こす可能性があるため、通常は推奨されないか、適切な方法とは見なされません。
  2. これは合法ですが、インフレーションは、アプリケーションで定義されているものではなく、実行しているシステムのデフォルトのテーマで行われます。
  3. Android 4.2以降で、スティッキーブロードキャストの現在の値を取得するために使用されるレシーバーがnullの場合に許可されます。

スクリーンショット

于 2017-03-09T16:31:38.313 に答える
39

getApplicationContext() -アプリケーションで実行されているすべてのアクティビティのコンテキストを返します。

getBaseContext() -アプリケーション内の別のコンテキストからContextにアクセスする場合は、アクセスできます。

getContext() -現在実行中のアクティビティのみのコンテキストビューを返します。

于 2014-03-10T08:51:02.770 に答える
28

ContextActvityまたはApplication新しく作成されたコンポーネントに関する情報を提供します。

Context新しく作成されたコンポーネント(アプリケーションコンテキストまたはアクティビティコンテキスト)に関連性を提供する必要があります

Activityはのサブクラスであるため、そのアクティビティのコンテキストを取得するためにContext使用できますthis

于 2013-03-02T13:28:01.400 に答える
3

getApplicationContext()

これはアプリケーションレベルで使用され、すべてのアクティビティを参照します。

getContext()およびgetBaseContext()

おそらく同じです。これらは、ライブである現在のアクティビティのみを参照します。

これ

常に現在のクラスオブジェクトを参照します。

于 2017-08-11T11:46:13.777 に答える
2

これ:現在のクラスオブジェクト

getContext():現在のライブアクティビティのコンテキストを返します

getApplicationContext():アプリケーションで実行されているすべてのアクティビティを返します

于 2021-03-24T06:08:12.327 に答える
1

このドキュメントから

私はあなたが使うべきだと理解しました:

コンテキストアクティビティの代わりにコンテキストアプリケーションを使用してみてください

于 2014-04-15T06:54:34.597 に答える
1

AContextは:

  • Androidシステムによって実装が提供される抽象クラス。
  • これにより、アプリケーション固有のリソースとクラスへのアクセス、およびアクティビティの起動、インテントのブロードキャストと受信などのアプリケーションレベルの操作のアップコールが可能になります。
于 2019-11-07T09:11:36.577 に答える
0

getApplicationContext()  -アプリケーションで実行されているすべてのアクティビティのコンテキストを返します。

getBaseContext()  -アプリケーション内の別のコンテキストからコンテキストにアクセスする場合は、アクセスできます。

getContext()  -現在実行中のアクティビティのみをコンテキストビューに返します。

これ-現在のクラスオブジェクトを参照します

これは現在のアクティビティクラスオブジェクトを参照し、アクティビティはコンテキストを継承するため、コンテキストまたはアクティビティを使用できる場合はこれを使用する必要があります。

于 2022-02-12T13:32:12.183 に答える