如果应用程序已通过深层链接打开,则Android深层链接不起作用 [英] Android deep link does not work if the app is opened by deep link already

查看:107
本文介绍了如果应用程序已通过深层链接打开,则Android深层链接不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果已通过深层链接打开应用,则深层链接不起作用。

然而,如果我不是通过触发深度链接来打开应用程序,比如点击应用程序图标来打开应用程序。则之后触发深度链接将始终起作用。


详情如下:

所以我在androidManifest中将我的活动设置为如下所示,即LaunchActivity。

<activity
    android:name="some.package.name.LaunchActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.SomeTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="dlscheme" android:host="dlhost" />
    </intent-filter>
</activity>

在LaunchActivity中,我将在onCreate()中打印一个日志,以指示它已经存在。

我使用了

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name

测试深度链接。

在关闭应用程序后,我使用了上面的命令。它可以打开应用程序并引导到正确的活动,没有问题。 并有以下日志。

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
Starting: Intent { act=android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name }
Status: ok
Activity: some.package.name/.activity.LaunchActivity
ThisTime: 898
TotalTime: 898
WaitTime: 919
Complete
但是,如果我再次输入相同的命令,而不终止应用程序。 它将只打开应用程序,但不会打开正确的活动,并生成以下日志。

adb shell am start -W -a android.intent.action.VIEW -d "dlscheme://dlhost/param" some.package.name
Starting: Intent { act=android.intent.action.VIEW dat=dlscheme://dlhost/param pkg=some.package.name }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: some.package.name/.activity.LaunchActivity
ThisTime: 0
TotalTime: 0
WaitTime: 6
Complete

加上这一额外行

Warning: Activity not started, its current task has been brought to the front

我实际上也在一个网站上尝试过,使用的是这个Chrome意图:

intent://dlhost/param#Intent;scheme=dlscheme;package=some.package.name;end

和它的行为相同。

推荐答案

在项目的清单文件中,您需要将以下内容添加到主要活动中。

android:launchMode="singleTask"

因此,在清单中,您将看到类似下面的内容:

<activity android:name="some.package.name.LaunchActivity" 
      android:launchMode="singleTask"
      android:screenOrientation="portrait"
      android:theme="@style/Theme.SomeTheme">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <intent-filter>
              <action android:name="android.intent.action.VIEW" />
              <category android:name="android.intent.category.DEFAULT" />
              <category android:name="android.intent.category.BROWSABLE" />
              <data android:scheme="dlscheme" android:host="dlhost" />
          </intent-filter>
 </activity>

基本上是创建一个新任务,并将一个新实例作为根实例推送到该任务。但是,如果任何任务中存在任何活动实例,系统就会通过onNewIntent()方法调用将意图发送到该活动实例。在此模式下,可以将活动实例推送到同一任务。如果用户单击当前活动中的后退键,系统将使用户返回到上一个活动。

另一方面,在singleTop中,如果活动的实例已存在于当前任务的顶部,并且系统将意图发送到此活动,则不会创建新实例,因为它将触发onNewIntent()方法,而不是创建新对象。

有关详细信息,请参阅here

希望这会有帮助:)

这篇关于如果应用程序已通过深层链接打开,则Android深层链接不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆