web-dev-qa-db-ja.com

Androidの明示的なアクティビティ呼び出しと暗黙的なアクティビティ呼び出しの違いは何ですか?

Androidの明示的なアクティビティ呼び出しと暗黙的なアクティビティ呼び出しの違いは何ですか?簡単な例で答えを説明すると良いでしょう。

36
Adham

例えば:

暗黙のアクティビティ呼び出し

インテントフィルターでは、アクティビティのアクションを作成します。これにより、他のアプリはこのアクションを介して次のようにアクティビティを呼び出すことができます。

<activity Android:name=".BrowserActivitiy" Android:label="@string/app_name">
   <intent-filter>
      <action Android:name="Android.intent.action.VIEW" />
      <category Android:name="Android.intent.category.DEFAULT" />
      <data Android:scheme="http"/> 
   </intent-filter>
</activity>

暗黙的なインテントを呼び出すもう1つの方法は次のとおりです。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);

明示的なアクティビティ呼び出し

どのアクティビティクラスを正確に示す呼び出しを行います。

Intent intent = new Intent(this, ActivityABC.class);
i.putExtra("Value", "This value for ActivityABC");
startActivity(intent);

これが、Androidでの明示的および暗黙的なアクティビティ呼び出しの詳細を理解するのに役立つことを願っています。

Android Intent here の詳細を取得できます

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

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

27
Varun Bhatia

どちらを使用するか?

明示的な意図:要求を処理できるコンポーネントがわかっている場合。そのため、そのコンポーネント名をインテントに明示的に記載します。

Intent i = new Intent(context,DetailActivity.class);  // DetailActivity.class is the component name
startActivity(i);

暗黙の意図:どのアプリケーションがリクエストを処理できるかわからない場合は、アクションに言及します意図的に、どのアプリケーションがタスクに適しているかをOSに決定させます。

例:音楽を再生する

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(file);
startActivity(intent);

OSの決定方法

インテントで暗黙的な呼び出しがある場合、OSはアクションを実行し、PackageManagerを使用してすべてのアプリケーションのすべての登録済みアクティビティのすべてのインテントフィルターと一致し、結果をリストとして取り込みます。 意図的解決 と呼ばれます
したがって、リクエストを処理できるアプリケーションがデバイスで使用できない可能性があります。その場合、NullPointer Exceptionが発生します。

暗黙のインテントを呼び出すより安全な方法はこれです

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
2
Rohit Singh

ここで意図の解決を参照してください

http://developer.Android.com/guide/topics/intents/intents-filters.html

明示的なインテント(アクティビティ)は特定のクラスを参照し、一般に、パッケージでのみ使用できます。暗黙的インテントとは、アプリが特定の種類のデータを処理できる、または特定のサービスを提供できることをアプリが公開するインテントフィルターのことです。メールを送る。暗黙的なインテントを使用すると、ユーザーはインテントの処理に使用するアクティビティ(通常はパッケージ)を選択するか、デフォルトのハンドラーが設定されている場合は起動されます。

2
Simon

いずれかのインタビューで、これらの間で混乱するたびに。だから、私はこの違いを心に留めておくのに役立つかもしれません、このように要約しました。

概要:

ImplicitIntentsでは、ユーザーimplicitlyはシステムに指示します[〜#〜] what [〜#〜]は、誰を行うべきかを指定せずに行う必要があります。

ExplicitIntentsでは、ユーザーexplicitlyはシステムに指示します[〜#〜] whom [〜#〜]作品が何であれトリガーされます。

1
SaadurRehman

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

  • 明示的な意図:

    インテントオブジェクトを作成する際、インテントでターゲットコンポーネント名を明示的に指定して渡しますが、これは明示的なインテントです。

  • 暗黙的意図:

    この場合、登録済みコンポーネントを評価するタスクを委任します(登録は通常、後で説明するインテントフィルターを使用して行われます)。インテントデータと目的のアクション(送信など)に基づいてAndroid電子メール、写真のキャプチャ、地図上のピン位置など)を通過します。そのためAndroidは同じアプリまたはインテントを処理できる他のアプリからコンポーネントを自動的に起動しますmessage/job。この場合のアイデアは、地図上の場所を固定する必要があるとしましょう。そのため、それを処理するために独自のアクティビティをコーディングする必要はありません。 Googleマップなどのアプリに位置データを渡すだけで、アプリの代わりに仕事をすることができます。

ソース: http://codetheory.in/Android-intents/

1
YOmna