【问题标题】:SingleTask activity, but opened through two different applicationsSingleTask 活动,但通过两个不同的应用程序打开
【发布时间】:2017-02-28 10:31:27
【问题描述】:

这张图片对理解 launhmode singleTask 提供的功能,取自 here

但是,我在相同的应用程序中理解这一点,我在理解上有问题 如果两个任务都属于两个不同的应用程序会怎样

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

  • 我正在浏览一个应用程序,该应用程序提供了一个发送操作 电子邮件,我选择了“发送电子邮件”选项。
  • 我手机的默认“电子邮件应用程序”将被选中,并且它的活动(即 声明为单任务)将被打开。
  • 在我输入电子邮件内容时,我切换到某个聊天应用程序,然后 该应用程序崩溃并为我提供了报告问题的选项 通过电子邮件发送给开发人员,现在当我选择 'Report' 时,我的电子邮件 应用程序(这是相同的默认电子邮件应用程序)将被打开。

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

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

【问题讨论】:

  • 我对此表示怀疑,您的内容应该保存为草稿,并且应该在其中加载带有收件人地址的新邮件活动虽然我觉得上面句子中的“应该”必须更改为“将”
  • @Neji 同样的“怀疑”是让我在这里提出这个问题的原因:D.
  • 如果您的 singleTask 活动不需要启动它,它将获得 onNewIntent() 回调。在 onNewIntent() 中,它应该将以前的邮件内容存储到草稿中,并清除其中写入的内容,同时放置正确的收件人地址
  • 如果使用 singleTask 启动模式调用相同的活动,则 onNewIntent() 将使用其 Intent 值调用,但如果您从两个不同的应用程序打开相同的活动,我认为它可能有不同的任务关联为什么你会发现这种行为。
  • @Chetan 我从来没有遇到过这种情况,我的问题基本上是'如果发生这种情况'

标签: android launchmode


【解决方案1】:

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

【讨论】:

  • 所以 singleTask 活动在 Android 设备上只有一个实例,我认为 singleTask 活动可能每个应用程序都有(或可以创建)一个实例。
  • 正确。您链接到的页面说了很多,但检查这些东西总是好的。使用代码和使用 ADB 命令非常有趣;那时它真的开始有意义了。网上有很多关于这个的错误教程,所以要小心(我最近自己做了这个调查,我建议你也试试)
  • 每个 ANDROID 设备一个实例已验证
  • 太好了,听起来你自己给了它一个 bash。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多