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

问题描述 投票:3回答:2

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

adb shell am start -W -a android.intent.action.VIEW -d "example://activityone?foo=bar" com.example.deeplinking

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

android uri deep-linking
2个回答
7
投票

首先,您应该阅读以下文档:Intents and Intent Filters。特别是“接受隐含意图”一节。

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

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

因此,您应该使用针对主机的intent过滤器在Manifest中定义一个活动,并使用真实的方案。请参阅Intent & Intent Filters文档的“操作测试”,“类别测试”和“数据测试”部分,以了解如何针对您的特定用例配置此部分。

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

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

http://example.com/activityone?foo=bar

由于这是一个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");
    }

}

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


2
投票

非标准URL方案(这是example://所用的)并不总是被视为链接。您最好的选择是以某种方式将该URL包装在应用程序可以识别的链接(http://https://)中,然后通常通过某种自动重定向来处理打开您的应用程序。这就是我们处理事情的方式,以确保无论链接在何处打开,应用程序始终都会启动。

© www.soinside.com 2019 - 2024. All rights reserved.