Android 8.0+ 深度链接打开启动器 Activity 只有当应用程序被杀死时

Android 8.0+ Deep Linking Opens Launcher Activity First Only When App was Killed

仅在 Android 8.0+ 上,当使用深度 link 打开我的应用程序(单击附加 URI 的推送通知)时,该应用程序将打开我的入口点 activity 并且然后打开深 linking activity.

在低于 8.0 的 Android 上看不到这一点。在那种情况下,它将直接打开深度 linking activity 而不会打开启动画面 activity.

不幸的是,该应用程序的工作方式是,当调用入口点 activity 时(它是启动画面),它会移动到另一个 activity。这使得在应用程序硬关闭时打开 deep link 非常不可靠,因为当 deep link activity 运行时(启动画面运行后大约 80 毫秒)应用程序已经过渡到下一个 activity 可能会完全抵消深度 link。

为了避免这种情况,我尝试通过将 launchMode 设置为 singleTask、singleTop 和 singleInstance 来处理启动画面 link 内部的深度 activity。不幸的是,none 成功了。

我已经设法通过使用计时器解决了这个问题,方法是让启动画面比平时长 200 毫秒,但该解决方案似乎很脏,而且似乎对所有设备都不太可靠。

这是我的启动 activity 和清单 linking activity 中的深度

<activity
 android:name=".activities.LauncherActivity"
 android:excludeFromRecents="true"
 android:taskAffinity="${launcherAffinity}"
 android:theme="@android:style/Theme.Translucent.NoTitleBar">
 <intent-filter>
    <action android:name="android.intent.action.MAIN" />

     <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>


<activity
 android:name=".activities.ParseDeepLinkActivity"
 android:theme="@android:style/Theme.NoDisplay">
 <intent-filter>
  <action android:name="android.intent.action.VIEW" />

   <data
     android:host="*"
     android:scheme="com.deeplink" />

     <category android:name="android.intent.category.DEFAULT" />
     <category android:name="android.intent.category.BROWSABLE" />
  </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="https"
         android:host="deep.link.net"
         android:pathPrefix="/mobile" />
  </intent-filter>
</activity>

这是我的启动器activity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launcher);
        startActivity(
                new Intent(this, LoginActivity.class)
                        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
        finish();
    }

如果能像8.0以下那样直接打开deeplinkactivity就好了。如果 deep linking 在 8.0+ 中发生了变化,我尝试搜索任何文档,但我什么也找不到。

已解决!

问题出在 UrbanAirship。我们在 onNotifactionOpened 方法中扩展 AirshipReceiver 的 class 默认返回 false,这意味着它还将启动启动器 activity。为什么这只会在 8.0+ 中引起问题我不太确定。这是我的解决方法

 @Override
    protected boolean onNotificationOpened(@NonNull Context context, @NonNull NotificationInfo notificationInfo) {
        Map<String, ActionValue> notificationActions = notificationInfo.getMessage().getActions();
        // Return false here to allow Urban Airship to auto launch the launcher activity
        try{
            return notificationActions.containsKey("^d");
        }catch(Exception e){
            return false;
        }
    }

^d 是此处列出的深度 link 操作的默认键 https://docs.airship.com/reference/libraries/android/latest/reference/com/urbanairship/actions/DeepLinkAction.html