这张图片非常有助于理解 由here
取自的回放模式singleTask
提供的功能
但是,我在相同的应用程序的情况下理解这一点,我有理解的问题 如果两个任务属于两个不同的应用程序
,该怎么办?令人困惑的场景(虚构),
当我输入我的电子邮件内容时,我切换到了一些聊天应用程序 应用程序崩溃了,并为我提供了报告问题的选项 通过电子邮件发送给开发者,现在我选择' 报告' , 我的电子邮件 应用程序(这是相同的默认电子邮件应用程序)将被打开。
现在,由于电子邮件应用的根活动是单一的,我的内容是 我写的内容会对我公开吗?
主要的是这次, 任务/堆栈属于两个不同的应用程序。
答案 0 :(得分:6)
即使您使用的是2个不同的应用程序,它也适用于expected way:
singleTask
活动已经存在,则会使用该副本,并调用方法onNewIntent()
从技术上讲,从链接中复制定义:
系统创建一个新任务并在该实例处实例化活动 新任务的根源。但是,如果活动的实例已经存在 在一个单独的任务中,系统将意图路由到 现有实例通过调用其onNewIntent()方法来代替 而不是创建一个新实例。只有一个活动实例可以 一次存在。
可以通过清单中的making an activity a target for sharing text和singleTask
轻松验证:
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
现在向onCreate()
和onNewIntent()
方法添加一些日志记录并进行一些场景测试。
我在测试各种启动模式时发现特别有用的东西是以下ADB命令:
adb dumpsys activity activities
这会输出大量文本(在执行此操作之前可能有助于重新启动手机 - adb reboot
),以显示活动任务堆栈的详细信息。这可用于向您显示您的singleTask
活动在通过不同的应用程序启动时“重新启用”。
关于电子邮件的问题,我认为这将取决于您使用的是哪个电子邮件客户端,但我希望他们正确处理onNewIntent()
方法,并在显示新电子邮件之前保存当前草稿