Android プログラミングでは、Contextクラスとは正確には何で、何に使用されますか?
開発者サイトでそれについて読みましたが、明確に理解できません。
Android プログラミングでは、Contextクラスとは正確には何で、何に使用されますか?
開発者サイトでそれについて読みましたが、明確に理解できません。
簡単に言えば:
名前が示すように、これはアプリケーション/オブジェクトの現在の状態のコンテキストです。新しく作成されたオブジェクトが何が起こっているのかを理解できるようにします。通常、これを呼び出して、プログラムの別の部分 (アクティビティとパッケージ/アプリケーション) に関する情報を取得します。
getApplicationContext()、、または( Application、Activity、Service、および IntentService クラスなどのから拡張されたクラス内にある場合)getContext()を呼び出すことによって、コンテキストを取得できます。getBaseContext()thisContext
コンテキストの典型的な用途:
新しいオブジェクトの作成: 新しいビュー、アダプター、リスナーの作成:
TextView tv = new TextView(getContext());
ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
標準の共通リソースへのアクセス: LAYOUT_INFLATER_SERVICE、SharedPreferences などのサービス:
context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(*name*, *mode*);
コンポーネントへの暗黙的なアクセス: コンテンツ プロバイダー、ブロードキャスト、インテントについて
getApplicationContext().getContentResolver().query(uri, ...);
Android のコンテキストのトピックは、多くの人にとって混乱を招くようです。人々は、Android で基本的なことを行うために Context が頻繁に必要であることを知っています。Context を必要とする何らかの操作を実行しようとして、正しい Context を「取得」する方法がわからないため、人々はパニックに陥ることがあります。Android の Context の概念を分かりやすく説明しようと思います。この問題を完全に扱うことはこの投稿の範囲を超えていますが、Context とは何か、どのように使用するかを理解できるように、一般的な概要を説明します。Context とは何かを理解するために、ソース コードを見てみましょう。
コンテキストとは正確には何ですか?
まあ、ドキュメント自体はかなり簡単な説明を提供します: Context クラスは「アプリケーション環境に関するグローバル情報へのインターフェイス」です。
Context クラス自体は抽象クラスとして宣言され、その実装は Android OS によって提供されます。ドキュメントはさらに、コンテキストが「…アプリケーション固有のリソースとクラスへのアクセスを許可するだけでなく、アクティビティの起動、インテントのブロードキャストと受信などのアプリケーションレベルの操作のアップコールを許可する」と規定しています。
これで、名前が Context である理由がよくわかります。それだけだからです。コンテキストは、必要に応じて、アクティビティ、サービス、またはその他のコンポーネントのリンクまたはフックを提供し、それによってシステムにリンクして、グローバル アプリケーション環境へのアクセスを可能にします。言い換えれば、Context は、「一般的にアプリとの関連で一体どこにいるのか、アプリの残りの部分にどのようにアクセス/通信するのか?」というコンポーネントの質問に対する答えを提供します。これが少し混乱しているように思われる場合は、Context クラスによって公開されているメソッドをざっと見てみると、その真の性質についてさらにいくつかの手がかりが得られます。
これらのメソッドのランダム サンプリングを次に示します。
getAssets() getResources()getPackageManager()getString()getSharedPrefsFile()これらすべての方法に共通するものは何ですか? それらはすべて、コンテキストにアクセスできる人は誰でも、アプリケーション全体のリソースにアクセスできるようにします。
つまり、コンテキストは、それへの参照を持つコンポーネントを残りのアプリケーション環境にフックします。たとえば、資産 (プロジェクトの「/assets」フォルダーを考えてください) は、アクティビティ、サービス、またはそれらのリソースへのアクセス方法を知っているものであれば、アプリケーション全体で利用できます。同じことが、リソースにフックするgetResources()ようなことを行うことにも当てはまります (aapt が Java コードを介してリソースへのアクセスを可能にすることは気にしないでください。これは別の問題です)。getResources().getColor()colors.xml
つまり、システム リソースへのアクセスを可能にするものと、コンポーネントを「より優れたアプリ」にフックするものです。抽象クラスの実装を提供するクラスでContextある のサブクラスを見てみましょう。最も明白なクラスはクラスです。継承自分自身から継承する from . これらのクラスは、より深いレベルで物事を理解するために見るのに役立ちます. しかし今のところ, それを知るだけで十分であり,彼らがどのように聞こえるかはほとんど. それらはの抽象要素を実装します.コンテキスト (実際のコンテキスト) を「ラップ」し、それらの関数をそのコンテキストに委譲することにより、クラス自体を作成します。ContextContextActivityActivityContextThemeWrapperContextWrapperContextContextThemeWrapperContextWrapperContextContextWrapperクラスの抽象メソッドgetAssetsはContext次のように実装されます。
@Override
public AssetManager getAssets() {
return mBase.getAssets();
}
mBaseコンストラクターによる特定のコンテキストへの単純なフィールドセットです。したがって、コンテキストがラップContextWrapperされ、 getAssets メソッドの実装がそのコンテキストに委譲されます。Activity最終的に継承するクラスの調査に戻り、Contextこれがどのように機能するかを確認しましょう。
アクティビティが何であるかはおそらくご存じでしょうが、復習すると、それは基本的に「ユーザーが実行できる 1 つのこと」です。ユーザーが操作する UI を配置するためのウィンドウを提供します。他の API に精通している開発者や、開発者ではない開発者でさえ、言語的には「画面」と考えるかもしれません。これは技術的に不正確ですが、私たちの目的には関係ありません。では、どのようにActivityとContextが相互作用し、継承関係で正確に何が起こっているのでしょうか?
繰り返しますが、具体的な例を見ると役に立ちます。アクティビティの起動方法は誰もが知っています。アクティビティを開始する「コンテキスト」があれば、 を呼び出すだけですstartActivity(intent)。インテントは、アクティビティを開始するコンテキストと開始したいアクティビティを記述します。これはおなじみのstartActivity(this, SomeOtherActivity.class).
とは何thisですか?クラスはから継承するthisため、あなたのアクティビティです。完全なスクープは次のとおりです。 を呼び出すと、最終的にクラスは次のように実行します。ActivityContextstartActivityActivity
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
したがってexecStartActivity、クラスから(実際には呼び出さInstrumentationれた内部クラスから)を利用します。InstrumentationActivityResult
この時点で、システムの内部を覗き始めています。
これは、OSが実際にすべてを処理する場所です。では、インストルメンテーションはどのようにしてアクティビティを正確に開始するのでしょうか? this上記のメソッドのパラメーターexecStartActivityはアクティビティ、つまりコンテキストであり、execStartActivityこのコンテキストを利用します。
30,000 の概要は次のとおりです。Instrumentation クラスは、作業を行うために監視しているアクティビティのリストを追跡します。このリストは、すべての活動を調整し、活動の流れを管理する際にすべてがスムーズに実行されるようにするために使用されます。
座標スレッドとプロセスの問題を完全に調べていない操作がいくつかあります。最終的に、ActivityResultはネイティブ オペレーションActivityManagerNative.getDefault().startActivity()を使用しContextます。これは、 を呼び出したときに渡したを使用しますstartActivity。渡されたコンテキストは、必要に応じて「意図の解決」を支援するために使用されます。インテント解決は、インテントが提供されない場合に、システムがインテントのターゲットを決定できるプロセスです。(詳細については、こちらのガイドをご覧ください)。
Android がこれを行うには、 によって提供される情報にアクセスする必要がありますContext。具体的には、システムはContentResolver「インテントのデータの MIME タイプを決定する」ことができるように にアクセスする必要があります。startActivityコンテキストをどのように利用するかについてのこの全体のビットは少し複雑で、私自身は内部を完全には理解していません。私の主なポイントアプリに不可欠な操作の多くを実行するために、アプリケーション全体のリソースにどのようにアクセスする必要があるかを説明するためのものでした.Contextはこれらのリソースへのアクセスを提供するものです. より簡単な例はビューかもしれません.RelativeLayoutまたは他のViewクラスを拡張してカスタム ビューを 作成するには、Context引数として。カスタム ビューをインスタンス化するときは、コンテキストを渡します。なんで?ビューは、テーマ、リソース、およびその他のビュー構成の詳細にアクセスできる必要があるためです。ビューの構成は、実際には良い例です。各コンテキストにはContext、ディスプレイの寸法や密度などのために OS 自体によって設定されるさまざまなパラメーター ( の実装のフィールド) があります。この情報がビューの設定などに重要である理由は簡単にわかります。
最後に一言: Android に慣れていない人 (そしてそうではない人でも) は、何らかの理由で、Android に関してはオブジェクト指向プログラミングを完全に忘れているようです。何らかの理由で、人々は Android 開発を先入観のあるパラダイムや学習した動作に曲げようとします。
Android には独自のパラダイムと特定のパターンがあり、先入観を捨ててドキュメントと開発者ガイドを読むだけで、実際には非常に一貫しています。ただし、「適切なコンテキストを取得する」ことは難しい場合がありますが、コンテキストが必要な状況に遭遇し、それがないと考えるため、人々は不当にパニックに陥ります。繰り返しになりますが、Java は継承設計のオブジェクト指向言語です。
アクティビティ自体が Context から継承されるため、Activity 内にコンテキストを「持つ」だけです。それには魔法はありません (OS がさまざまなパラメーターを設定し、コンテキストを正しく「構成」するためにそれ自体で行うすべてのことを除いて)。したがって、メモリ/パフォーマンスの問題は別として (たとえば、必要のないときにコンテキストへの参照を保持したり、メモリに悪影響を与える方法でそれを実行したりするなど)、Context は他のオブジェクトと同様にオブジェクトであり、渡すことができます。 POJO (Plain Old Java Object) と同じように。場合によっては、そのコンテキストを取得するために巧妙なことを行う必要があるかもしれませんが、Object 自体から拡張する通常の Java クラスは、コンテキストにアクセスできる方法で作成できます。コンテキストを受け取り、必要に応じてそのクラスで使用するパブリック メソッドを公開するだけです。
Context はシステムへのハンドルです。リソースの解決、データベースや設定へのアクセスの取得などのサービスを提供します。Android アプリにはアクティビティがあります。Context は、アプリケーションが現在実行されている環境へのハンドルのようなものです。アクティビティ オブジェクトは Context オブジェクトを継承します。
詳細については、「Android Studio を使用した Android 開発の概要 - チュートリアル」を参照してください。
Contextアプリケーション環境に関するグローバル情報への「インターフェース」です。実際にContextは、は抽象クラスであり、その実装はAndroidシステムによって提供されます。
これにより、アプリケーション固有のリソースとクラスへのアクセス、およびアクティビティの起動、インテントのブロードキャストと受信などのアプリケーションレベルの操作のアップコールが可能になります。
次の図では、クラスの階層を確認できます。ここContextで、はこの階層のルートクラスです。特に、それActivityはの子孫であることを強調する価値がありContextます。

Context正確には何ですか?
Android リファレンス ドキュメントによると、これはさまざまな環境データを表すエンティティです。ローカル ファイル、データベース、環境に関連付けられたクラス ローダー、サービス (システム レベルのサービスを含む) などへのアクセスを提供します。この本全体を通して、また Android での日常的なコーディングでは、Context が頻繁に渡されることがわかります。
「Android in Practice」本から、p. 60。
いくつかの Android API にはContextas パラメータが必要です
さまざまな Android API に目を通すと、それらの多くがandroid.content.Contextオブジェクトをパラメーターとして受け取ることがわかります。また、Activity または Service は通常、 として使用されることもわかります
Context。これらのクラスは両方とも から拡張されているため、これが機能しContextます。
contextアンドロイドで理解するための簡単な例:
すべてのボスには、重要度が低く時間のかかるタスクをすべて実行するためのアシスタントがいます。ファイルやコーヒーが必要な場合は、アシスタントが逃走中です。一部の上司は、オフィスで何が起こっているかをほとんど知らないため、アシスタントにもこのことを尋ねます。彼らは自分で仕事をすることもありますが、他のほとんどのことはアシスタントの助けが必要です.
このシナリオでは、
Boss – Android アプリケーションです
Assistant – はコンテキストです
ファイル/一杯のコーヒー – リソースです
アクティビティ、アプリケーションなど、アプリケーションのさまざまな部分に関する情報を取得する必要がある場合は、通常、コンテキストを呼び出します。
コンテキストが関係するいくつかの操作 (アシスタントが必要なもの):
コンテキストを取得するさまざまな方法:
getContext()
getBaseContext()
getApplicationContext()
this
Androidコンテキストは、アプリケーション固有のリソースとクラス、およびアプリケーション環境に関する情報へのアクセスを可能にするインターフェースです(Java の意味ではなく、一般的な意味で、Java では実際には抽象クラスです!)。Context
Android アプリが Web アプリの場合、コンテキストは次のようになりますServletContext(ここでは正確な比較はしていません)。
アクティビティとサービスも拡張Contextされるため、これらのメソッドをすべて継承して、アプリが実行されている環境情報にアクセスします。
アプリまたはサービスが実行されているプロセスをサイロ化した VM と考えてください。サイロ化された環境は、基盤となる一連のシステム情報と特定の許可されたリソースにアクセスできます。これらのサービスを利用するには、そのコンテキストが必要です。
Context は、現在のオブジェクトへの参照です。また、コンテキストにより、アプリケーション環境に関する情報にアクセスできます。
このクラスandroid.content.Contextは、Android システムとプロジェクトのリソースへの接続を提供します。これは、アプリケーション環境に関するグローバル情報へのインターフェイスです。
Context は、位置情報サービスなどの Android サービスへのアクセスも提供します。
アクティビティとサービスはクラスを拡張しContextます。
コンテキストは、アプリケーション環境に関するグローバル情報へのインターフェイスです。これは、システムによって実装が提供される抽象クラスですAndroid。
Contextアプリケーション固有のリソースとクラスへのアクセス、および次のようなアプリケーションレベルの操作の呼び出しを許可しますlaunching activities, broadcasting and receiving intents, etc.
ここに例があります
public class MyActivity extends Activity {
public void Testing() {
Context actContext = this; /*returns the Activity Context since Activity extends Context.*/
Context appContext = getApplicationContext(); /*returns the context of the single, global Application object of the current process. */
Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);
Context BtnContext = BtnShowAct1.getContext(); /*returns the context of the View. */
詳細については、http://developer.android.com/reference/android/content/Context.html をご覧ください。
Context は、クラス android.content.Context のインスタンスであり、アプリケーションを実行する Android システムへの接続を提供します。たとえば、コンテキストを介して現在のデバイス ディスプレイのサイズを確認できます。
また、プロジェクトのリソースへのアクセスも提供します。これは、アプリケーション環境に関するグローバル情報へのインターフェイスです。
Context クラスは、時間ベースのイベントをトリガーするアラーム マネージャーなどの Android サービスへのアクセスも提供します。
アクティビティとサービスは Context クラスを拡張します。したがって、コンテキストにアクセスするために直接使用できます。
コンテキストは基本的に、リソースアクセスと、アプリケーション(アプリケーションコンテキストの場合)またはアクティビティ(アクティビティコンテキストの場合)またはその他の環境の詳細を取得するためのものです。
メモリリークを回避するには、コンテキストオブジェクトを必要とするすべてのコンポーネントにアプリケーションコンテキストを使用する必要があります。詳細については、ここをクリックしてください。
Aは、ほとんどの人がApplicationContextと呼ぶものです。それは Android システムによって作成され、アプリケーションができることだけを行うことができます。Tomcat では、Context は私がアプリケーションと呼ぶものでもあります。
多くのアクティビティを保持する 1 つのコンテキストがあり、各アクティビティには多くのビューがある場合があります。
明らかに、あれやこれやの理由で適合しないと言う人もいますが、おそらく正しいでしょうが、コンテキストが現在のアプリケーションであると言うと、メソッドパラメーターに何を入れているかを理解するのに役立ちます。
コンテキストの専門性を深く掘り下げる前に、ちょっとした類推をしてみましょう
すべてのボスには、重要度が低く時間のかかる作業を行うアシスタントまたは誰か (用事の少年) がいます。たとえば、ファイルやコーヒーが必要な場合は、アシスタントが実行されます。上司はバックグラウンドで何が起こっているかを知りませんが、ファイルまたはタスクは配信されます
So Here
Boss - Android Application
Assistant - コンテキスト
ファイルまたは一杯のコーヒー - リソース
コンテキストは、アプリケーション関連のリソースへのアクセス ポイントです
そのようなリソースまたはタスクのいくつかを見てみましょう
活動を開始します。
ファイルシステム上のアプリケーション固有のキャッシュ ディレクトリへの絶対パスを取得します。
システムで実行されている特定のプロセスおよびユーザー ID に対して、特定の許可が許可されているかどうかを判別します。
特定の権限が付与されているかどうかを確認します。
等々。
そのため、Android アプリケーションがアクティビティを開始したい場合、Context(アクセス ポイント) に直接移動し、Contextクラスは彼にリソース (この場合はインテント) を返します。
他のクラスと同様に、Contextクラスにはフィールドとメソッドがあります。
詳細についてContextは、公式ドキュメントを参照してください。使用可能なメソッド、フィールド、メソッドでフィールドを使用する方法など、ほぼすべてがカバーされています。
クラス android.content.Context のインスタンスは、アプリケーションを実行する Android システムへの接続を提供します。たとえば、コンテキストを介して現在のデバイス ディスプレイのサイズを確認できます。
また、プロジェクトのリソースへのアクセスも提供します。これは、アプリケーション環境に関するグローバル情報へのインターフェイスです。
Context クラスは、時間ベースのイベントをトリガーするアラーム マネージャーなどの Android サービスへのアクセスも提供します。
アクティビティとサービスは Context クラスを拡張します。したがって、コンテキストにアクセスするために直接使用できます。
コンテキストは、リソース、データベース、プライベート ファイル ディレクトリ、設定、設定などのアプリのプライベート データへのアクセスを提供する、各アプリサンドボックスへの Android 固有の APIです。
プライベート データのほとんどは、1 つのアプリケーションのすべてのアクティビティ/サービス/ブロードキャスト リスナーで同じです。
Application、Activity、Service は Context インターフェースを実装しているため、API 呼び出しで Context パラメーターが必要な場合に使用できます。
コンテキストの詳細については、この記事をお読みください。それを簡単に説明します。
コンテキストとは何かを知りたい場合は、それが何をするのかを知る必要があります...
たとえば、getContext()はコンテキストを取得するメソッドの 1 つです。getContext() では、コンテキストはアクティビティとそのライフサイクルに関連付けられています。Context は、Activity の背後にあるレイヤーとして想像でき、Activity が存続する限り存続します。アクティビティが死ぬ瞬間、コンテキストも死にます。このメソッドは、次のような機能のリストをアクティビティに提供します。
Load Resource Values,
Layout Inflation,
Start an Activity,
Show a Dialog,
Start a Service,
Bind to a Service,
Send a Broadcast,
Register BroadcastReceiver.
今それを想像してください:
コンテキストは、そのコンポーネント (アクティビティ、アプリケーションなど) とコンポーネントのライフサイクルの背後にあるレイヤー (インターフェイス) であり、アプリケーション環境と Android フレームワークによってサポートされるさまざまな機能へのアクセスを提供します。
Context電流を意味します。
Context現在の画面の操作を行うために使用します。元。
1. getApplicationContext()
2. getContext()
Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();