如果应用程序已经通过深度链接打开,那么 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

它也会表现出同样的行为。

34218 次浏览

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

android:launchMode="singleTask"

并处理 onNewIntent()内部的深层链接

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipe);
onNewIntent(getIntent());
}


protected void onNewIntent(Intent intent) {
String action = intent.getAction();
String data = intent.getDataString();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
String recipeId = data.substring(data.lastIndexOf("/") + 1);
Uri contentUri = RecipeContentProvider.CONTENT_URI.buildUpon()
.appendPath(recipeId).build();
showRecipe(contentUri);
}
}

在 LaunchActivity 活动标记的清单中添加 android:launchMode="singleTop"

我发现增加 android:launchMode="singleTask"的工作。 singleTop不适合我。

Mainefest 文件如下所示

<activity
android:name=".user.HomeActivity"
android:screenOrientation="portrait"
android:exported="true"
android:launchMode="singleTop"
android:windowSoftInputMode="stateAlwaysHidden"
android:theme="@style/AppTheme.NoActionBar" >
<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="example"/>
<data android:host="example.com"
android:pathPrefix="/deeplink"/>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>

家居活动

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri data = intent.getData();
if (data != null)
callDeep(data);
setIntent(intent);
Log.d("DeepLinking", "new intent value==>" + data + "==== value===>");
}
//or in on create
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Uri data = intent.getData();
Log.d("DeepLinking", "intent value==>" + data + "==== value===>" + bundle + "===action==>" + action);
}

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

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>

基本上,它所做的就是创建一个新任务,并将一个新实例作为根实例推送到该任务。但是,如果任何任务中存在任何活动实例,系统将通过 onNewInent ()方法调用将意图路由到该活动实例。在这种模式下,可以将活动实例推送到相同的任务。如果用户单击当前活动的 BACK 键,系统将把用户返回到前一个活动。

另一方面,在 singleTop中,如果当前任务顶部已经存在一个活动实例,并且系统将意图路由到该活动,则不会创建任何新实例,因为它将启动一个 onNewInent ()方法,而不是创建一个新对象。

更多信息可以找到 给你

希望这对你有帮助:)

在清单中添加活动的 android:launchMode="singleTop"

如果你的启动模式是默认的,那么这个警告就会出现“警告: 活动没有启动,它当前的任务已经被放到了前面”,因为每次它都会创建你活动的新实例,而如果你使用 Single Top 启动模式,那么就会调用 onNewIntent()方法而不是创建一个新对象

从日志中可以看出,它所说的“警告: 活动未启动,其当前任务已被放在前面”,因此不会创建活动的新实例。在这种情况下,新意图将重定向到活动的 onNewInant (意图意图)。

在您的例子中,我怀疑您没有覆盖这个方法,并且将从活动的 onCreate ()方法中提取信息。

相反,应该创建一个类似提取 DataFromInentAndProcess (意图)的方法,并从活动的 oncreate 方法(提取 DataFromInentAndProcess (getInent ()))和 onNewInent 方法(提取 DataFromInentAndProcess (意图))中调用它。

我在 NavigationUI 和 AppLink 集成方面遇到过类似的问题。我遵循的是单个活动架构,所以如果应用程序已经存在于任务堆栈中,并且我想使用 AppLink 打开单独的片段,那么在 launchMode = “ singleTask”中就无法工作。我甚至尝试过完成 OnTaskLaunch,但似乎都不管用。

然后通过文档(我一开始就应该这么做) ,我了解到在上面的情况下,意图是在活动类的 OnNewInant ()中接收到的,并将意图从当前片段重定向到需要的片段,我们需要调用:

//获取活动类的 navController 实例,然后

HandleDeepLink (意图)

这解决了我在已经有其他片段在任务中时通过 AppLink/DeepLink 打开所需片段的问题。

希望我能帮上忙。