【问题标题】:Never start activity from a broadcastreceiver?从不从广播接收器开始活动?
【发布时间】:2014-06-04 09:03:22
【问题描述】:

android初学者,请多多包涵……

根据文档,您永远不应该从广播接收器开始活动:

"(...)永远不要启动 Activity 来响应传入的广播 Intent。"

http://developer.android.com/training/run-background-service/report-status.html

(文档的最后一行)。

所以,这是我的问题:因为我需要从后台服务显示活动选择器,而且我不应该从广播接收器启动活动,那么我该如何解决我的问题?

【问题讨论】:

  • 如果您需要提醒用户任何事情,您可以发送通知。如果它很重要,用户将点击通知,这将打开活动。

标签: android android-activity broadcastreceiver


【解决方案1】:

您的具体情况需要进一步说明。你到底想做什么?

同时,这里的背景说明应该可以帮助您了解此规则何时适用,以及是否应在您的应用中打破它。


"(...)永远不要启动 Activity 来响应传入的广播 意图。”

这与使用通知栏向用户提供Notification 的想法有关。这个想法是,您永远不应该打断用户当时正在尝试做的事情。

Android 意识到用户随时都知道自己想做什么,操作系统无权打断用户。这与其他使用弹出窗口来提醒用户即将到来的事件的系统形成鲜明对比。


因此,您引用背后的想法是,您永远不应该通过启动您自己的活动来将用户的注意力从他当前的活动中拉出来。

这可能很糟糕,想象一下你正在玩游戏,突然 Luis 的活动出现在游戏前面。


但是,该规则有例外:

1

如果用户已经在使用您的应用,并且您收到了Intent,那么您的BroadcastReceiver 应该会启动您自己的活动。

当用户不使用您的应用时,请改为发布Notification。

您可以在 Whatsapp 等应用中看到此类行为。如果您在应用程序中,则不会收到通知,而应用程序只会显示新消息。如果您不在应用程序中,您会收到通知。

2

有时开始这样的活动是预期的行为,这是有道理的。

一个明显的例子是电话应用程序。它必须在电话响起时启动,我们已经接受了这一点。

这是另一个从接收者开始活动的合法用例。这是一个时钟应用程序,设计为在手机充电时启动:

【讨论】:

  • 你好,理查德。感谢你及时的答复。在我的应用程序中,我正在使用一项服务来导出数据。这是典型的场景: 1. 用户点击操作栏中的导出选项 2. 启动意图服务以处理 csv 文件的生成 3. 从服务生成本地广播意图 4. 该广播由接收器处理哪个负责让用户决定如何发送csv文件(Intent.ACTION_SEND)有没有比使用服务+广播接收器而不阻塞应用程序主线程更好的方法?
  • 你好。好的,我最终从等式中删除了广播接收器,因为可以使用 FLAG_ACTIVITY_NEW_TASK 标志从服务启动活动...
  • @LuisAbreu 是的,这可能是您尝试做的更简单的方法。在更复杂的情况下,您可能希望使用android.os.Message 和android.os.Messenger 与Handler 进行通信。我只是提到这一点,以便您知道它存在,并且如果您需要它,可以在您了解更多信息时搜索它。祝你好运。
  • 你好,理查德。是的,我已经看到了。但是,在这种情况下,它似乎比必要的复杂:)
  • @LuisAbreu 绝对是。只是想我会把它放在你的雷达上以备不时之需。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多