Android暗黙的なインテントは、その柔軟性のために、ほとんどの場合に適切な選択であることに気付きました。しかし、明示的なインテントについてはどうですか?それらを使用する利点は何ですか?それらを使用する練習?
暗黙的インテントは、呼び出されるべきAndroidコンポーネントを直接指定するのではなく、実行されるアクションのみを指定します。
例えば
Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com"));
これにより、WebブラウザがWebページを開きます。 Androidシステムは、特定のアクションとデータ型に登録されているすべてのコンポーネントを検索します。多くのコンポーネントが見つかった場合、ユーザーは使用するコンポーネントを選択できます。
明示的なインテントは、1つのアクティビティが他のアクティビティに切り替えることができるアプリケーション自体で使用されます...例Intent intent = new Intent(this,Target.class);
これにより、現在のコンテキストからターゲットアクティビティにアクティビティが切り替わります。明示的インテントを使用して、putExtra
メソッドを使用して他のアクティビティにデータを渡し、getIntent().getExtras()
メソッドによってターゲットアクティビティによって取得することもできます。
これが役に立てば幸いです。
通常、アプリケーション内でアクティビティを開始するには、明示的なインテントを使用します。その時点で、どのアクティビティを開始するかを正確に把握しているため、暗黙的なインテントを設定する追加の作業を行う理由はありません。
明示的なインテントは、特定のコンポーネントを呼び出すために使用されます。起動するコンポーネントがわかっていて、使用するコンポーネントをユーザーが自由に制御できないようにする場合。たとえば、2つのアクティビティがあるアプリケーションがあるとします。アクティビティAとアクティビティB。アクティビティAからアクティビティBを起動します。この場合、アクティビティBをターゲットとする明示的なインテントを定義し、それを使用して直接呼び出します。
暗黙のインテントは、何をしたいのかがわかっているが、どのコンポーネントを起動する必要があるかわからない場合に使用されます。または、使用するコンポーネントのリストから選択するオプションをユーザーに提供する場合。これらのインテントがAndroidシステムに送信されると、特定のアクションとデータ型に登録されているすべてのコンポーネントを検索します。コンポーネントが1つだけ見つかった場合、Androidはコンポーネントを直接起動します。たとえば、カメラを使用して写真を撮るアプリケーションがあります。アプリケーションの機能の1つは、ユーザーが撮影した写真を送信できるようにすることです。ユーザーが写真を送信できるアプリケーションの種類がわからない場合、また、複数のアプリケーションがある場合に使用する外部アプリケーションを選択するオプションをユーザーに提供する必要があります。この場合、明示的なインテントを使用しません。代わりに、アクションがACTION_SENDに設定され、データのエクストラが写真のURIに設定されている暗黙のインテントを使用する必要があります。
明示的なインテントは、その内容に関係なく、常にターゲットに配信されます。フィルターは調べられません。ただし、コンポーネントのフィルターの1つを通過できる場合にのみ、暗黙的なインテントがコンポーネントに配信されます
1)明示的なインテント:開発者が知っているコンポーネント名は、インテントで指定された名前です。
2)暗黙的インテント:インテントにコンポーネントが指定されていません。
明示的な意図:
どのActivity
がリクエストを処理できるかが正確にわかっている場合は、明示的なインテントを使用します。
例:リストアクティビティがあり、リスト内のアイテムをクリックすると、詳細アクティビティが開きます。この場合、あなたは[〜#〜] [[##〜]を知っています。アイテムの詳細はDetailActivity.class
アプリケーションの。したがって、このアクションを実行するには、クラス名を明示的に指定してインテントを作成します。
Intent showDeatil = new Intent(this,DetaiActivy.class);
startActivity(showDeatil);
暗黙の意図:
どのアプリケーションのどのアクティビティがリクエストを処理できるかわからない場合は、暗黙的なインテントを使用します。
例:リンクがあります。リンクをクリックすると、ブラウザでWebページが開きます。あなたは知らないどのアプリケーションのどのアクティビティがリクエストを処理できるかを正確に知りません。あなたはそれがウェブページリンクであるという漠然としたアイデアを持っているので、誰かがそれを開いたときにいくつかのブラウザでウェブページを開く必要があります。この場合、ACTIONを指定するだけで、残りはOSが処理します。
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
それには用語があります。これはインテント解決と呼ばれます。
インテント解決。
OSはインテントで指定されたACTIONを取り出します。
PackageManagerに移動し、デバイスにインストールされているすべてのアプリケーションと一致するACTIONを持つすべての登録済みアクティビティを検索します。
一致するすべてのアプリケーションのリストをポップアップで表示します。
場合によっては、ACTIONと一致するアクティビティがない可能性があります。この場合、NullPointerExceptionが発生します。より好ましい方法はこれです
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
ブラウザアプリケーションをいくつか作成したとしましょう。誰かがリンクを開いたときに、アプリケーションをポップアップリストに表示する場合。次に、Intent Filters AndroidManifest.xmlファイルを使用して、アクティビティにアクティビティを登録する必要があります。このような。
<application
..... >
......
<activity Android:name=".YourBrowserActivity">
<action Android:name="Android.intent.action.VIEW" />
<data Android:scheme="http" Android:Host="www.example.com" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
.....
</application>
Docs から:
インテントには2つのタイプがあります。
このように両方の意図を簡単に説明できます。
Explicit Intents:単一のアプリケーション内の2つのアクティビティ間の通信に使用されます。
例:2つのフィールド(ユーザー名とパスワードなど)で構成されるログインページを持つアプリケーションを考えてみましょう。両方が正しい場合、以前に入力したユーザー名フィールドを表示するページに移動します。この場合、明示的なインテントを使用します。アクティビティを変更し、同じアプリケーション内の1つのアクティビティから別のアクティビティ(ユーザー名フィールド)にデータを送信する必要があります。
Implicit Intents:異なるアプリケーションの2つのアクティビティ間の通信に使用されます。
例:事故のビデオを記録してFacebookにアップロードする事故について説明するニュースアプリを検討します。ニュースアプリで指定されたリンクをクリックすると、Facebookに誘導されます。この場合、通信はニュースアプリのアクティビティとFacebookアプリのアクティビティの間で行われます。この目的のために、暗黙的インテントを使用します。
理解していただければ幸いです。