如何在Android中打开深层链接uri?

s-h*_*ter 4 android uri deep-linking

例如,有一个uri 示例:// activityone?foo = bar,它可以打开一个应用程序并通过此adb命令启动其中一个活动

adb shell am start -W -a android.intent.action.VIEW -d "example://activityone?foo=bar" com.example.deeplinking
Run Code Online (Sandbox Code Playgroud)

有没有其他方法通过这个uri启动Android应用程序(例如:// activityone?foo = bar)?如何将这个uri放入电子邮件中,点击它后,它会启动应用程序?

mpk*_*uth 8

首先,您应该阅读以下文档:Intents和Intent Filters.特别是"接受隐含意图"一节.

正如其他人所说,使用自定义方案存在问题.

  • 它们并不总是被视为链接
  • 您不拥有它们就像拥有域名(主机)一样.

因此,您应该使用针对主机的intent过滤器在Manifest中定义一个活动,并使用真实的方案.请参阅Intent&Intent Filters文档的"Action Test","Category Test"和"Data Test"部分,了解如何针对您的特定用例配置它.

<activity android:name="com.example.app.ActivityOne">
    <intent-filter>
        <data android:scheme="http"/>
        <data android:host="example.com"/>
        <data android:path="/activityone"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

然后,您将能够使用如下链接.

http://example.com/activityone?foo=bar
Run Code Online (Sandbox Code Playgroud)

由于这是一个http链接,系统会要求用户选择要打开它的应用程序(您的应用程序或其首选浏览器).如果他们选择你的应用程序,它将启动ActivityOne,它可以获得这样的查询数据.

public class ActivityOne extends Activity {

    @Override
    public void onResume() {
        super.onResume();
        Intent intent = getIntent();
        Uri uri = intent.getData();
        String foo = uri.getQueryParameter("foo");
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您在意图过滤器中使用自定义方案,那么您(很可能)将是唯一注册处理该意图的应用程序,用户将不必选择您的应用程序.但是,在电子邮件中包含带有自定义方案的链接会更加困难.大多数电子邮件客户端都不会识别任何自定义方案作为链接,并且不会被点击.