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