Android プログラミングでは、Context
クラスとは正確には何で、何に使用されますか?
開発者サイトでそれについて読みましたが、明確に理解できません。
Android プログラミングでは、Context
クラスとは正確には何で、何に使用されますか?
開発者サイトでそれについて読みましたが、明確に理解できません。
簡単に言えば:
名前が示すように、これはアプリケーション/オブジェクトの現在の状態のコンテキストです。新しく作成されたオブジェクトが何が起こっているのかを理解できるようにします。通常、これを呼び出して、プログラムの別の部分 (アクティビティとパッケージ/アプリケーション) に関する情報を取得します。
getApplicationContext()
、、または( Application、Activity、Service、および IntentService クラスなどのから拡張されたクラス内にある場合)getContext()
を呼び出すことによって、コンテキストを取得できます。getBaseContext()
this
Context
コンテキストの典型的な用途:
新しいオブジェクトの作成: 新しいビュー、アダプター、リスナーの作成:
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 . これらのクラスは、より深いレベルで物事を理解するために見るのに役立ちます. しかし今のところ, それを知るだけで十分であり,彼らがどのように聞こえるかはほとんど. それらはの抽象要素を実装します.コンテキスト (実際のコンテキスト) を「ラップ」し、それらの関数をそのコンテキストに委譲することにより、クラス自体を作成します。Context
Context
Activity
Activity
ContextThemeWrapper
ContextWrapper
Context
ContextThemeWrapper
ContextWrapper
Context
ContextWrapper
クラスの抽象メソッド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
ため、あなたのアクティビティです。完全なスクープは次のとおりです。 を呼び出すと、最終的にクラスは次のように実行します。Activity
Context
startActivity
Activity
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
したがってexecStartActivity
、クラスから(実際には呼び出さInstrumentation
れた内部クラスから)を利用します。Instrumentation
ActivityResult
この時点で、システムの内部を覗き始めています。
これは、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 にはContext
as パラメータが必要です
さまざまな 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();