当前位置: 首页 > 知识库问答 >
问题:

Android深链接不工作,如果应用程序是由深链接已经打开

阎智
2023-03-14

如果应用程序已由Deep link打开,则Deep link不起作用。

但是,如果我不是通过触发深度链接来打开应用程序,比如单击应用程序图标来打开应用程序。之后触发deeplink将一直有效。

详情如下:

所以我在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>

在LaunchActive中,我将打印一个日志,以表明它已经在那里。

我用了

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

它会表现得一样。

共有3个答案

徐瀚
2023-03-14

在LaunchActivity标签的清单中添加android:launchMode=“singleTop”

郑燕七
2023-03-14

在项目的清单文件中,您需要将跟随添加到您的主要活动中。

android:launchMode="singleTask"

并处理内部的deeplinkonNewIntent()

@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);
    }
}
孔扬
2023-03-14

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

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()方法调用将意图路由到该活动实例。在这种模式下,活动实例可以推送到同一任务。如果用户单击当前活动中的BACK键,系统将返回用户到上一个活动。

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

更多信息可以在这里找到。

希望这有帮助:)

 类似资料:
  • 演示网站:http://recipe-app.com/recipe/grilled-potato-salad演示应用:http://search-codelabs.appspot.com/codelabs/android-deep-linking 我的测试: 我已经从上面的链接安装了演示应用程序。我用谷歌搜索应用程序搜索了“烤土豆沙拉”,结果发现http://recipe-app.com/reci

  • 因此,我试图找出是否有可能深度链接当前未安装该应用程序的用户。以下是我试图做的:1)用户在移动浏览器中点击网站上的深度链接。2) 用户将被带到应用商店安装应用3)一旦安装,用户将被带到应用中特定内容的深层链接。 到目前为止,我发现的最接近Android应用程序安装横幅的东西,但这并不是我想要的。这可能吗? 以下是页面底部附近Android应用安装横幅的链接:https://medium.com/@

  • 我有一个可以从网页上的按钮打开的应用程序。我在清单中有一个意图过滤器,如下所示: 如果用户没有安装应用程序,该链接将打开Play Store。如果用户拥有该应用程序,则会将其打开。 问题是当用户最近安装应用程序时。如果用户安装了应用程序,但从未打开它,当他选择URL时,将打开Play Store而不是我的应用程序。一旦用户第一次打开应用程序,那么所有应用程序都会正常工作。 有没有办法打开应用程序总

  • 深度链接在android中不起作用。我已经把清单代码贴在这里了。当我测试时,它会进入网站,而不会在我的应用程序中打开我的活动。谁能帮我修一下吗? 更新: adb shell am start-W-aandroid.intent.action.VIEW-d"http://www.clinicloud.com/xyz"com.clinicloud.app 使用adb进行测试会打开应用程序,但仅使用浏览

  • 我有一个网站可以让用户进行搜索查询。查询可能需要一些时间来完成(几分钟到几天),我想让用户下载一个Android应用程序,并通过向用户发送一封带有链接的电子邮件来收到答案。 我希望无论用户是否安装了应用程序,这种机制都能起作用;换句话说: 如果用户拥有该应用程序,则应该使用包含标识符参数的深层链接打开该应用程序。 如果用户没有它,它应该在应用程序的页面上打开播放商店(例如

  • 我想为我的cordova android应用程序启用应用程序索引,如下所述:https://developers.google.com/app-indexing/webmasters/app 不幸的是,我找不到留档如何做一个科尔多瓦的应用程序。有一个插件收听和广播意向,但我不认为这将帮助我在这种情况下:https://github.com/Initsogar/cordova-webintent 我