2016-12-04 18 views
3

さまざまなアクティビティを使用して作業を開始し、結果を開始する際には、インテントを使用する以外に選択肢はありません。今の意図は文脈を必要とし、それは私にとって意味をなさない。私はコンテキストがアプリケーションリソースへのアクセスを許可していることを知っていますが、インテントにコンテキストが必要なのはなぜですか?

理由は単純なメッセンジャーだけのアプリケーションリソースについて知る必要はありますか?

また、私は一部の人々がgetApplicationContext()でインテントを作成する理由を理解していませんが、これは他のアクティビティコンテキストでこれを使用していますか?

最後に、startActivityResult()を呼び出すアクティビティが、コンテキスト "this"を渡すのではなく、アプリケーションコンテキストの代わりにonActivityResult()メソッドでコールバックを受け取る方法についてはわかりません。コールバックを受け取るために、「this」を使用するか、startActivityResult()という現在のアクティビティコンテキストを渡す必要があると私は考えました。それはちょうど真っ直ぐなJava権利ですか?あなたがクラスを渡すと、他のアクティビティクラスはあなたのクラスへの参照を持ち、クラス内のメソッド(onActivityForResult()を呼び出すことができます)。しかし、これはそうではありませんので、私は何が欠けていますか?

答えて

4

Intentそれ自体はContextを必要としません。コンストラクタIntent#Intent(Context, Class)は、便利なコンストラクタであり、提供された引数を内部的に使用してComponentNameを生成します。 ComponentNameは順番に、アプリのパッケージ名とターゲットのクラス名です。しかし、あなたにもちょうど空のコンストラクタIntent#Intent()を使用してComponentName自分(Intent#setComponentName(ComponentName))を提供することができます

com.foo.bar/com.foo.bar.ui.activity.MyActivity 

:だからComponentNameのようなものかもしれません。

したがって、アプリケーションやアクティビティのコンテキストを入力しても問題ありません(後者の方が簡単に入力できます)。また、アプリケーションコンテキストを必要とするクラスはContext#getApplicationContextを呼び出すことができるので、心配する必要はありません。

startActivityForResult() - Androidは内部的にあなたのアクティビティレコードのスタックを管理します。したがって、結果はスタックの前のアクティビティに配信されます。 「戻る」をクリックすると、どこに戻ってくるかを知るのと同じ方法です。

アクティビティインスタンスのスタックを管理しているわけではありません。これらのインスタンスは、メモリが解放されるまでに破棄され、ガベージコレクトされる可能性があります。ただし、スタックには、それらを再作成して状態を復元するための情報が含まれています。

+0

こんにちは、あなたの答えは非常に明確で簡潔です。しかし、私はちょっとした説明をしたいだけです。したがって、私がアクティビティを開始するたびに、startActivity()を呼び出すアクティビティはスタックに正しく登録されますか?では、アンドロイドはそのアクティビティを参照して、そのアクティビティを特に渡さないとスタックに登録する方法を知っています。 – Wowzer

+0

システムは、どのアクティビティがスタック(アクティビティ)の最上部にあるかを知っています。そして、新しいものを始めると、それを識別するためにコンポーネント名が使用されます。暗黙のインテント(明示的なターゲット名の代わりにアクションを持つインテント)を使用しても、最終的に特定のコンポーネント名に解決されます。 –

0

Androidの開発はそれほど深くはありませんが、それでも私は説明をしてみましょう。したがって、基本的にコンテキストは、リソースをプログラムに接続するための参照です。各オブジェクトには、そのオブジェクトを設定するために必要なリソースが含まれる独自のコンテキストが与えられます。これは、他の目的の中でも、多くのオブジェクトを作成し、プログラム識別情報を取得する必要があります。これにより、新しいビューとアクティビティを設定することは非常に貴重ですが、他の目的にも使用できます。詳細はAndroid Contextを参照してください。

これによると、pageActivity inherits contextです。したがって、あなたがアクティビティにいる場合は、コンテキストを使用するために渡す必要があります。また、getBaseContext()へのポインタも含まれています。場合によっては、アプリケーション・コンテキスト全体が必要な場合は参照する必要がありますが、しばらくの間はそうはならない可能性があります。

コンテキストを必要としないインテントを作成する方法があります。しかし、特定のパッケージの特定のクラスをターゲットにしたい場合は、ターゲットパッケージのコンテキストを提供することがそれを行うための準備ができています。このContext Lessonを参照してください。

snctinが彼のanswergetApplicationContext() offers application contextで説明したように。基本的に、アプリケーションコンテキストはアプリケーションに関連付けられており、アプリのライフサイクル全体を通じて常に同じになります。 this postも参照してください。

Android - How to start (display) a new Activityを参照してください。それによると

startActivity(new Intent(this, ProjectsActivity.class));

は、現在のクラスを使用すると、startActivityメソッドへのアクセスを与える、Androidのアクティビティクラスの1拡張を前提としています。

Getting result from a activityによれば、別のアクティビティを開始することは一方向である必要はありません。別のアクティビティを開始し、結果を返すこともできます。結果を受け取るには、(startActivity()の代わりに)startActivityForResult()を呼び出します。

たとえば、カメラアプリを起動してキャプチャした写真を受け取ることができます。または、ユーザーが連絡先を選択するためにピープルアプリを起動すると、結果として連絡先の詳細が表示されます。このpostは、同じようにより良い方法を理解するのに役立ちます。

希望に役立ちます。また、あなたの質問のおかげで、私はAndroidをリフレッシュしてくれました。:)

0

IntentContextが必要ではありませんが、あなた自身が指摘したように、Intentは単なるメッセンジャーです。また、アプリケーション/オブジェクトの現在の状態を新しく作成されたオブジェクトに渡すので、アプリケーションで正確に何が起こっているのかを理解できます。そしてそれが我々が文脈に合格する必要がある理由です。

そして、あなたは約startActivityForResult()について質問したいと思います。 Android自体は、他のコールバックが処理されるのと同じ方法でコールバックを処理します。アクティビティライフサイクルの例を挙げることができます。起動するたびにonCreate(), onStart(), onResume()はAndroidによって呼び出されます。

+0

新しいアクティビティを起動すると、すべてのアクティビティが同じアプリケーションコンテキストから継承されるため、アンドロイドはデフォルトでその新しいアクティビティにコンテキストを与えるだけなので、コンテキストがアプリケーションで何が起こっているのかを理解するために使用されているとは思わないアクティビティがアプリケーション内にあることを示します。 – Wowzer

+0

Androidは新しいアクティビティにアプリケーションコンテキストを提供しません。 getAplicationContext()を使用してこれを使用すると違いがあります。 Androidはそれを宣言するコンテキストを提供します。質問番号1026973を参照してください – hittsss

関連する問題