这个问题与深层链接有关。例如,我的应用程序中有四个 Activity ,分别是 MainActivity
、FirstActivity
、SecondActivity
和 DeepLinkActivity
。以下是 list 文件中的 Activity 。
<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
深层链接→FirstActivity
打开。 - 用户最小化应用程序,然后单击
launch://second
→SecondActivity
在FirstActivity
之上打开。 - 用户再次最小化应用程序,然后单击
launch://first
。
在第 3 步之后,我期望操作系统打开 FirstActivity
。但实际上它恢复了任务,因此 SecondActivity
(来自第 2 步)重新出现。发生这种情况是因为第 1 步和第 3 步的深层链接相同,因此操作系统将它们视为相同的 Intent。
在这种特殊情况下,如何防止 Android 系统恢复任务?
最佳答案
经过一些试验后,我就是这样做的。
在开始之前为 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
。
关于java - 如果新 Intent 与启动应用程序的初始 Intent 相同,则阻止 Android 系统恢复任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358185/