web-dev-qa-db-ja.com

Android暗黙的インテントVS明示的インテント

Android暗黙的なインテントは、その柔軟性のために、ほとんどの場合に適切な選択であることに気付きました。しかし、明示的なインテントについてはどうですか?それらを使用する利点は何ですか?それらを使用する練習?

58

暗黙的インテントは、呼び出されるべき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()メソッドによってターゲットアクティビティによって取得することもできます。

これが役に立てば幸いです。

118
Aditya Kamath

通常、アプリケーション内でアクティビティを開始するには、明示的なインテントを使用します。その時点で、どのアクティビティを開始するかを正確に把握しているため、暗黙的なインテントを設定する追加の作業を行う理由はありません。

24
Cheryl Simon
  1. 明示的なインテントは、特定のコンポーネントを呼び出すために使用されます。起動するコンポーネントがわかっていて、使用するコンポーネントをユーザーが自由に制御できないようにする場合。たとえば、2つのアクティビティがあるアプリケーションがあるとします。アクティビティAとアクティビティB。アクティビティAからアクティビティBを起動します。この場合、アクティビティBをターゲットとする明示的なインテントを定義し、それを使用して直接呼び出します。

  2. 暗黙のインテントは、何をしたいのかがわかっているが、どのコンポーネントを起動する必要があるかわからない場合に使用されます。または、使用するコンポーネントのリストから選択するオプションをユーザーに提供する場合。これらのインテントがAndroidシステムに送信されると、特定のアクションとデータ型に登録されているすべてのコンポーネントを検索します。コンポーネントが1つだけ見つかった場合、Androidはコンポーネントを直接起動します。たとえば、カメラを使用して写真を撮るアプリケーションがあります。アプリケーションの機能の1つは、ユーザーが撮影した写真を送信できるようにすることです。ユーザーが写真を送信できるアプリケーションの種類がわからない場合、また、複数のアプリケーションがある場合に使用する外部アプリケーションを選択するオプションをユーザーに提供する必要があります。この場合、明示的なインテントを使用しません。代わりに、アクションがACTION_SENDに設定され、データのエクストラが写真のURIに設定されている暗黙のインテントを使用する必要があります。

    明示的なインテントは、その内容に関係なく、常にターゲットに配信されます。フィルターは調べられません。ただし、コンポーネントのフィルターの1つを通過できる場合にのみ、暗黙的なインテントがコンポーネントに配信されます

20
Varun Bhatia

1)明示的なインテント:開発者が知っているコンポーネント名は、インテントで指定された名前です。

2)暗黙的インテント:インテントにコンポーネントが指定されていません。

13

キー:知っているときと知らないとき

明示的な意図:

どの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の決定方法

それには用語があります。これはインテント解決と呼ばれます。
インテント解決。

  • 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>

参考文献
一般的なインテントアクションとそのインテントフィルタリスト
インテントフィルターとインテント解像度の詳細

8
Rohit Singh

Docs から:

インテントには2つのタイプがあります。

  • 明示的な意図は、名前(完全修飾クラス名)で開始するコンポーネントを指定します。開始するアクティビティまたはサービスのクラス名がわかっているため、通常は明示的なインテントを使用して独自のアプリでコンポーネントを起動します。たとえば、ユーザーのアクションに応じて新しいアクティビティを開始したり、バックグラウンドでファイルをダウンロードするサービスを開始したりできます。
  • 暗黙的インテントは、特定のコンポーネントに名前を付けるのではなく、実行する一般的なアクションを宣言します。これにより、別のアプリのコンポーネントがそれを処理できます。たとえば、ユーザーに地図上の場所を表示したい場合、暗黙的なインテントを使用して、別の対応アプリが地図上の指定された場所を表示するように要求できます。
3
Ivan
  1. 暗黙的なインテント-特定のタスクを実行するためにインテントを介してシステムコンポーネントを呼び出したいときに、使用するコンポーネントの名前が実際にはわからない場合、Androidシステムは目的のタスクを実行するアプリケーションのリスト。
  2. 明示的な意図-アクティビティの完全修飾名で別のアクティビティを呼び出したいとき、そしてもちろんアクティビティの名前を知っています。
2

このように両方の意図を簡単に説明できます。

Explicit Intents:単一のアプリケーション内の2つのアクティビティ間の通信に使用されます。

例:2つのフィールド(ユーザー名とパスワードなど)で構成されるログインページを持つアプリケーションを考えてみましょう。両方が正しい場合、以前に入力したユーザー名フィールドを表示するページに移動します。この場合、明示的なインテントを使用します。アクティビティを変更し、同じアプリケーション内の1つのアクティビティから別のアクティビティ(ユーザー名フィールド)にデータを送信する必要があります。

Implicit Intents:異なるアプリケーションの2つのアクティビティ間の通信に使用されます。

例:事故のビデオを記録してFacebookにアップロードする事故について説明するニュースアプリを検討します。ニュースアプリで指定されたリンクをクリックすると、Facebookに誘導されます。この場合、通信はニュースアプリのアクティビティとFacebookアプリのアクティビティの間で行われます。この目的のために、暗黙的インテントを使用します。

理解していただければ幸いです。

1
Roshan S

暗黙の意図

  • どのアプリケーションをプルアップするかを指定せずに、新しいアプリケーションをプルアップします。
  • 実行するアクションのみを指定し、Androidコンポーネントを直接指定しません。
  • URIを暗黙的なIntentとともに使用して、データのタイプを指定できます。

明示的な意図

  • 特定のアプリケーションをプルアップし、コードの作成中に設定されます。
  • 1つのアクティビティが他のアクティビティに切り替えることができるアプリケーション自体で使用されます。
  • Put extraメソッドを使用して他のアクティビティにデータを渡すために使用され、ターゲットアクティビティgetIntent()によって取得されます。
  • フィルタが参照されなくても、常にターゲットに配信されます。
0
KARSHIL SHETH