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

15

这张图片对理解singleTask启动模式的功能很有帮助,图片来源于这里

enter image description here 然而,在同一个应用程序的情况下,如果两个任务属于不同的应用程序,我就有困惑了。

令人困惑的情况(虚构):

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

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

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


我有疑问,你的内容应该保存为草稿,并加载一个新的邮件活动,其中包含收件人的地址。 虽然我觉得上面句子中的“should”应该改为“will”。 - Neji
@Neji,正是因为这个“疑惑”,我才在这里提出了这个问题:D。 - nobalG
1
如果不需要启动singleTask活动,则会在onNewIntent()中回调。在onNewIntent()中,它应该将先前的邮件内容存储到草稿中,并清除其中编写的内容,同时放置正确的收件人地址。 - Neji
如果使用singleTask启动模式调用同一活动,则onNewIntent()将使用其意图值进行调用。但是,如果从两个不同的应用程序打开相同的活动,则可能具有不同的任务亲和性,这就是为令您发现此行为的原因。 - Chetan Joshi
@Chetan 我从未遇到过这种情况,我的问题基本上是“如果发生这种情况会怎样”。 - nobalG
1个回答

6
即使您使用了2个不同的应用程序,它也将按照预期的方式工作:
  • 如果您的singleTask活动已经存在,则会使用该副本,并调用onNewIntent()方法
  • 如果不存在,则会像往常一样启动
更技术性地说,根据您链接中的定义进行复制:

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


这可以通过将活动设为共享文本的目标并在清单中使用singleTask轻松验证:

making an activity a target for sharing text

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

1
因此,单个任务(singleTask)活动在Android设备上只有一个实例,我认为单个任务(singleTask)活动可以每个应用程序创建一个实例。 - nobalG
正确。你链接的页面已经说得很清楚了,但是检查这些事情总是好的。玩弄代码并使用ADB命令非常有趣;那时它真的开始变得有意义了。关于这个问题,网上有很多错误的教程,所以要小心(我最近自己进行了这项调查,我建议你也试一试)。 - Richard Le Mesurier
1
每个安卓设备只能有一个实例。 - nobalG
1
太好了,听起来你自己试了一下。 - Richard Le Mesurier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接