如果新 Intent 与启动应用程序的初始 Intent 相同,则阻止 Android 系统恢复任务
Prevent Android system from resuming task if the new Intent is the same with initial Intent that launches the app
这个问题与深度link有关。例如,我的应用程序中有四个活动,即 MainActivity
、FirstActivity
、SecondActivity
和 DeepLinkActivity
。以下是清单文件中的活动。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".FirstActivity" />
<activity android:name=".SecondActivity" />
<activity android:name=".DeepLinkActivity"
android:theme="@android:style/Theme.NoDisplay">
<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="launch" />
</intent-filter>
</activity>
DeepLinkActivity
将根据收到的 URI FirstActivity
、SecondActivity
或 MainActivity
启动:
public class DeepLinkActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
launchIntent(getIntent());
}
private void launchIntent(Intent intent) {
Intent newIntent = null;
switch (intent.getData().getHost()) {
case "first":
newIntent = new Intent(this, FirstActivity.class);
break;
case "second":
newIntent = new Intent(this, SecondActivity.class);
break;
default:
newIntent = new Intent(this, MainActivity.class);
break;
}
startActivity(newIntent);
finish();
}
}
问题是,Android 系统似乎记录了启动应用程序的初始 Intent,然后用它来恢复前台 Activity 当前 运行 中的任何内容 -if- 新 Intent 与初始 Intent 相同。
考虑以下情况:
- 用户点击
launch://first
深link→FirstActivity
打开
- 用户最小化应用程序然后单击
launch://second
→ SecondActivity
在 FirstActivity
之上打开。
- 用户再次最小化应用程序然后单击
launch://first
。
在第 3 步之后,我期望的是 OS 打开 FirstActivity
。但实际上它恢复了任务,所以 SecondActivity
(来自第 2 步)重新出现。发生这种情况是因为步骤 1 和步骤 3 中的深度 link 相同,因此 OS 将它们视为相同的 Intent。
如何防止 Android 系统在这种特殊情况下恢复任务?
您可以尝试在 Activities OnPause 函数上定义一些内容,以便在每次 activity 暂停时重置意图。
经过一些试验后,我就是这样做的。
在启动前为 newIntent
设置标志:
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
然而,单独设置标志并没有完成工作,应用程序仍然恢复到最后 activity。然后我将 launchMode 添加到 DeepLinkActivity
:
<activity android:name=".DeepLinkActivity"
android:theme="@android:style/Theme.NoDisplay"
android:launchMode="singleTask">
现在应用程序已重新启动并打开预期 activity!请注意,launchMode 也可以是 singleInstance
。
这个问题与深度link有关。例如,我的应用程序中有四个活动,即 MainActivity
、FirstActivity
、SecondActivity
和 DeepLinkActivity
。以下是清单文件中的活动。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".FirstActivity" />
<activity android:name=".SecondActivity" />
<activity android:name=".DeepLinkActivity"
android:theme="@android:style/Theme.NoDisplay">
<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="launch" />
</intent-filter>
</activity>
DeepLinkActivity
将根据收到的 URI FirstActivity
、SecondActivity
或 MainActivity
启动:
public class DeepLinkActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
launchIntent(getIntent());
}
private void launchIntent(Intent intent) {
Intent newIntent = null;
switch (intent.getData().getHost()) {
case "first":
newIntent = new Intent(this, FirstActivity.class);
break;
case "second":
newIntent = new Intent(this, SecondActivity.class);
break;
default:
newIntent = new Intent(this, MainActivity.class);
break;
}
startActivity(newIntent);
finish();
}
}
问题是,Android 系统似乎记录了启动应用程序的初始 Intent,然后用它来恢复前台 Activity 当前 运行 中的任何内容 -if- 新 Intent 与初始 Intent 相同。
考虑以下情况:
- 用户点击
launch://first
深link→FirstActivity
打开 - 用户最小化应用程序然后单击
launch://second
→SecondActivity
在FirstActivity
之上打开。 - 用户再次最小化应用程序然后单击
launch://first
。
在第 3 步之后,我期望的是 OS 打开 FirstActivity
。但实际上它恢复了任务,所以 SecondActivity
(来自第 2 步)重新出现。发生这种情况是因为步骤 1 和步骤 3 中的深度 link 相同,因此 OS 将它们视为相同的 Intent。
如何防止 Android 系统在这种特殊情况下恢复任务?
您可以尝试在 Activities OnPause 函数上定义一些内容,以便在每次 activity 暂停时重置意图。
经过一些试验后,我就是这样做的。
在启动前为 newIntent
设置标志:
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
然而,单独设置标志并没有完成工作,应用程序仍然恢复到最后 activity。然后我将 launchMode 添加到 DeepLinkActivity
:
<activity android:name=".DeepLinkActivity"
android:theme="@android:style/Theme.NoDisplay"
android:launchMode="singleTask">
现在应用程序已重新启动并打开预期 activity!请注意,launchMode 也可以是 singleInstance
。