クリックされたリンクまたはプログラムによるリクエ:
- URIが指定されている場合は、URIを処理できるユーザーの優先アプリを開きます。
- URIを処理できる唯一の利用可能なアプリを開きます。
- ユーザーがダイアログからアプリを選択できるようにします。
コンテンツへのリンクを作成してテストするには、以下の手順に従います。 Android StudioのApp Links Assistantを使用して、Androidアプリリンクを追加することもできます。
着信リンクのインテントフィルタの追加
アプリコンテンツへのリンクを作成するには、マニフェストに次の要素と属性値を含むインテントフィルタを追加します。
<action>
ACTION_VIEW
インテントアクションを指定して、Google検索からインテントフィルタに到達できるようにします。 <data>
1つ以上の<data>
タグを追加し、それぞれがアクティビティに解決されるURI形式を表します。 最低でも、<data>
タグにはandroid:scheme
属性が含まれている必要があります。
さらに属性を追加して、アクティビティが受け入れるURIの種類をさらに絞り込むことができます。 たとえば、類似したUriを受け入れるが、単にパス名に基づいて異なる複数のアクティビティがある場合があります。 この場合、android:path
属性またはそのpathPattern
またはpathPrefix
バリアントを使用して、システムが異なるURIパスに対してどのアクティビティを開くかを区別します。
<category>
BROWSABLE
カテゴリを含む。 Intentフィルターがwebbrowserからアクセスできるようにするには、これが必要です。 それがなければ、ブラウザでリンクをクリックすると、アプリに解決できません。
にはDEFAULT
も含まれます。これにより、アプリは暗黙的なインテントに応答できます。 これがなければ、intentがアプリコンポーネント名を指定している場合にのみ、アクティビティを開始できます。
次のXMLスニペットは、ディープリンクのためにマニフェストでインテントフィルタを指定する方法を示しています。 Uri"example://gizmos"
と"http://www.example.com/gizmos"
はどちらもこのアクティビティに解決されます。
<activity android:name="com.example.android.GizmosActivity" android:label="@string/title_gizmos" > <intent-filter android:label="@string/filter_view_http_gizmos"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "http://www.example.com/gizmos" --> <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/gizmos" /> <!-- note that the leading "/" is required for pathPrefix--> </intent-filter> <intent-filter android:label="@string/filter_view_example_gizmos"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "example://gizmos" --> <data android:scheme="example" android:host="gizmos" /> </intent-filter></activity>
二つのインテントフィルタは<data>
要素によってのみ異なることに注意してください。同じフィルターに複数の<data>
要素を含めることは可能ですが、uniqueURLsを宣言する場合(scheme
とhost
の特定の組み合わせなど)は、同じインテントフィルター内の複数の<data>
要素が実際には結合された属性のすべてのバリエーションを考慮してマージされるため、別々のフィルターを作成することが重要です。 たとえば、次のことを考えてみましょう:
<intent-filter> ... <data android:scheme="https" android:host="www.example.com" /> <data android:scheme="app" android:host="open.my.app" /></intent-filter>
これはhttps://www.example.com
とapp://open.my.app
のみをサポートしているかのように見えるかもしれません。 しかし、実際にはこれらの2つに加えて、app://www.example.com
とhttps://open.my.app
をサポートしています。
アクティビティコンテンツのUriを含むインテントフィルタをappmanifestに追加すると、Androidは実行時に一致するUriを持つIntent
をアプリにルーティングできます。
インテントフィルタの定義の詳細については、”他のアプリにアクティビティの開始を許可する”を参照してください。
受信インテントからのデータの読み取り
システムがインテントフィルタを介してアクティビティを開始すると、Intent
によって提供されたデータを使用して、レンダーする必要があるかどうかを判断できます。 呼び出し、getData()
とgetAction()
着信に関連付けられているデータとアクションを取得するメソッドIntent
。 これらのメソッドは、アクティビティのライフサイクル中はいつでも呼び出すことができますが、通常はonCreate()
やonStart()
などの初期のコールバック中に行う必要が
ここでは、データを取得する方法を示すスニペットです。Intent
:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val action: String? = intent?.action val data: Uri? = intent?.data}
Java
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = getIntent(); String action = intent.getAction(); Uri data = intent.getData();}
ユーザーの操作性を向上させるには、次のベストプラクティスに従ってください:
- ディープリンクは、プロンプト、インタースティシャルページ、またはログインなしで、ユーザーをコンテンツに直接移動させる必要があります。 ユーザーが以前にアプリケーションを開いたことがない場合でも、アプリのコンテンツを参照できるようにしてください。それは、その後の相互作用や、彼らはランチャーからアプリを開いたときにユーザーにプロンプトを表示することは大丈夫です。
- “ナビゲーションのバックアップとアップ”で説明されている設計ガイダンスに従って、ディープリンクを介してアプリに入った後、アプリがユーザーの後方ナビゲーションに対する期待と一致するようにします。
ディープリンクのテスト
アクティビティマネージャ(am)ツールでAndroid DebugBridgeを使用して、ディープリンクに指定したintent filterURIsが正しいアプリアクティビティに解決 デバイスまたはエミュレータに対してadbコマンドを実行できます。
adbを使用してインテントフィルタURIをテストするための一般的な構文は次のとおりです:
$ adb shell am start -W -a android.intent.action.VIEW -d <URI> <PACKAGE>
たとえば、次のコマンドは、指定されたURIに関連付けられているターゲットアプリアクティビティを表示しようとします。
$ adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos" com.example.android
上記で設定したマニフェスト宣言とインテントハンドラーは、アプリとウェブサイトの間の接続と、着信リンクの処理を定義します。 ただし、システムでアプリを一連のUriの既定のハンドラーとして処理するには、システムにこの接続の確認を要求する必要があります。 次のレッスンでは、この検証を実装する方法について説明します。