SingleTask活动,但通过两个不同的应用程序打开

nob*_*alG 15 android launchmode

这张图片非常有助于理解singleTask这里获取的洗衣模式提供的功能

在此输入图像描述 但是,在同一个应用程序的情况下,我理解这一点,如果两个任务属于两个不同的应用程序,我会遇到问题

令人困惑的场景(虚构),

  • 我正在浏览一个应用程序并且应用程序提供了发送电子邮件的操作,我选择了" 发送电子邮件 "选项.
  • 我的手机默认的' 电子邮件应用 '将被选中,其活动(被宣布为单一任务)将被打开.
  • 当我输入我的电子邮件内容时,我切换到一些聊天应用程序,应用程序崩溃了,并为我提供了通过电子邮件向开发人员报告问题的选项,现在当我选择" 报告 "时,我的电子邮件应用程序(这是将打开相同的默认电子邮件应用程序).

  • 现在,由于电子邮件应用程序的根活动是单一任务,我写的内容是否会对我可见?

最重要的是这次,任务/堆栈属于两个不同的应用程序.

Ric*_*ier 6

即使您使用的是2个不同的应用程序,它也会以预期的方式工作:

  • 如果您的singleTask活动已经存在,则将使用该副本,并onNewIntent()调用该方法
  • 如果它不存在,它将按照正常方式启动

从技术上讲,从链接再现定义:

系统创建新任务并在新任务的根目录下实例化活动.但是,如果活动的实例已存在于单独的任务中,则系统会通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例.一次只能存在一个活动实例.


通过将活动作为共享文本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>
Run Code Online (Sandbox Code Playgroud)

现在为onCreate()onNewIntent()方法添加一些日志记录并进行一些场景测试.


我发现在测试各种启动模式时特别有用的是以下ADB命令:

  • adb dumpsys activity activities

这会输出大量文本(在执行此操作之前可能有助于重新启动手机 - adb reboot),显示活动任务堆栈的详细信息.这可用于向您显示您的singleTask活动在通过不同的应用程序启动时"重新连接"自身.


至于关于电子邮件的问题,我认为这将取决于您使用的是哪个电子邮件客户端,但我希望他们onNewIntent()正确处理该方法,并在显示您的新电子邮件之前保存当前的草稿.