开发者社区 问答 正文

从QRCode扫描仪启动时显示多个任务的Android应用

场景:

  1. QRCode扫描URL方案
  2. 打开扫描的URL方案
  3. 启动主活动(根)
  4. 启动欢迎活动(通过带有Intent.FLAG_ACTIVITY_NEW_TASK的startActivity)
  5. 启动欢迎活动A(通过startActivityForResult)
  6. 基于onActivityResult,启动Welcome活动B(通过startActivityForResult)
  7. 基于onActivityResult,启动Welcome活动C(通过startActivityForResult)
  8. 完成“欢迎”活动,回到“主要”活动。 所有活动都在AndroidManifest.xml上使用标准启动模式

最近的应用程序堆栈上显示的任务分为3项:

  1. QRCode扫描仪任务
  2. 主要活动任务
  3. 欢迎活动任务 如果我们从应用程序图标(而不是从QRCode扫描仪)启动应用程序,则最新应用程序堆栈上显示的任务只有一个任务。

通过QRCode扫描仪启动时,是否有办法防止在最近的应用程序上显示多个任务?

展开
收起
Puppet 2019-12-05 13:24:11 444 分享 版权
阿里云 AI 助理回答

在Android中,通过QRCode扫描仪启动应用程序并导致多个任务出现在最近的应用程序堆栈上,主要是因为每个startActivityForResult都创建了新的任务。要解决这个问题,可以通过调整活动的启动模式(launchMode)和任务亲缘关系(taskAffinity)来控制任务的创建行为。

一种可能的解决方案是将欢迎活动系列(Welcome A、B、C)设置为单实例模式(singleInstance)或者单任务模式(singleTask),并且确保它们属于同一个任务。这样,当从QRCode扫描器启动时,这些活动会复用已存在的任务,而不是创建新的任务。以下是相应的AndroidManifest.xml配置示例:

<activity
    android:name=".WelcomeActivityA"
    android:launchMode="singleTask"
    android:taskAffinity="${applicationId}.WelcomeTask">
</activity>

<activity
    android:name=".WelcomeActivityB"
    android:launchMode="singleTask"
    android:taskAffinity="${applicationId}.WelcomeTask">
</activity>

<activity
    android:name=".WelcomeActivityC"
    android:launchMode="singleTask"
    android:taskAffinity="${applicationId}.WelcomeTask">
</activity>

请注意,使用singleTasksingleInstance模式时,系统不会在调用startActivityForResult后等待结果,因此你可能需要通过其他方式传递数据,比如广播(BroadcastReceiver)、事件总线(如GreenRobot's EventBus)或者通过应用内全局变量/ViewModel。

此外,为了确保主活动不被重复创建,你也可以为主活动设置适当的launchMode,例如singleTop,并处理Intent以避免不必要的重新启动。

最后,当从QRCode扫描器启动时,你可以考虑使用显式Intent,并且指定FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP,这将清除位于目标Activity之上的所有活动,并且如果目标Activity已经在栈顶,则不会创建新的实例,而是调用其onNewIntent()方法。

Intent intent = new Intent(QRCodeScanner.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

通过上述方法,你应该能够减少或消除因QRCode扫描启动而导致的多余任务显示问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: