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

时间:2017-02-28 10:31:28

标签: android launchmode

这张图片非常有助于理解 由here

取自的回放模式singleTask提供的功能

enter image description here 但是,我在相同的应用程序的情况下理解这一点,我有理解的问题  如果两个任务属于两个不同的应用程序

,该怎么办?

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

  • 我正在浏览一个应用程序,该应用程序提供了一个动作发送 电子邮件,我选择' 发送电子邮件'选项。
  • 我手机的默认' 电子邮件应用'将被选中及其活动(即 声明为singletask)将被打开。
  • 当我输入我的电子邮件内容时,我切换到了一些聊天应用程序 应用程序崩溃了,并为我提供了报告问题的选项 通过电子邮件发送给开发者,现在我选择' 报告' , 我的电子邮件 应用程序(这是相同的默认电子邮件应用程序)将被打开。

  • 现在,由于电子邮件应用的根活动是单一的,我的内容是 我写的内容会对我公开吗?

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

1 个答案:

答案 0 :(得分:6)

即使您使用的是2个不同的应用程序,它也适用于expected way

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

从技术上讲,从链接中复制定义:

  

系统创建一个新任务并在该实例处实例化活动   新任务的根源。但是,如果活动的实例已经存在   在一个单独的任务中,系统将意图路由到   现有实例通过调用其onNewIntent()方法来代替   而不是创建一个新实例。只有一个活动实例可以   一次存在。

可以通过清单中的making an activity a target for sharing textsingleTask轻松验证:

    <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()方法,并在显示新电子邮件之前保存当前草稿