当我杀死我的应用程序时,BroadcastReceiver无法正常工作

mra*_*ski 7 android broadcastreceiver

我注意到,每当我通过长按手机的后退按钮手动杀死我的应用程序时,我的广播接收器就会停止工作.每次用户挂断电话时,接收方负责显示通知,并在manifest.xml中注册该通知.

这是正常/预期的行为吗?我认为接收器应该继续工作,即使用户决定杀死我的应用程序......有没有办法防止这种情况?

谢谢.

编辑

这是接收器的清单条目:

<receiver android:name=".BroadcastReceivers.CallReceiver" android:enabled="true">
   <intent-filter>
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
       <action android:name="android.intent.action.PHONE_STATE" />
   </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

Com*_*are 11

这个星球上有大约70亿人.只有你知道"杀戮"是什么意思.

但是,您所描述的症状与"强制停止"一致.用户通常会通过转到"设置",在已安装的应用列表中找到您的应用,以及点击应用的"强制停止"按钮来强制停止应用.有一些设备和固件构建使得"强制停止"比这更容易访问 - 这些设备和固件版本是由流口水的白痴恕我直言写的.

如果您的应用程序被强制停止,您的代码将永远不会再运行,直到某些内容使用显式Intent启动您的某个组件.通常,用户通过点击主屏幕启动器中的应用程序图标来执行此操作.在用户执行此操作之前,您BroadcastReceiver将无法工作,并且您无能为力.

而不是使用一些设备上的功能来"杀死"你的应用程序,尝试通过DDMS终止其进程.如果您的应用程序继续在这种情况下工作,那么您选择在执行"强制停止"之前"杀死"您的应用程序.仅仅因为内存不足而终止您的进程不应该阻止您接收未来的广播.

  • @mradzinski"杀人是一个广泛采用的术语,你所谓的力量停止" - 不是真的."甚至还有一组像任务杀手一样的应用程序将这个术语作为他们名字的一部分" - 任务杀手和任务经理不会做"强制停止".他们终止后台进程.这不是"强制停止",它不仅会终止进程,还会删除警报并阻止您的应用再次自动运行.SDK应用程序无法执行"强制停止".这只能通过固件实现,这就是为什么它通常只能通过设置访问. (4认同)
  • @MuhammadBabar:"我之前注册的BroadcastReceiver会像STICKY一样吗?" - 好吧,在清单中登记的收件人仍然可以使用.通过`registerReceiver()`注册的接收器不会,直到你得到一个新进程并再次运行`registerReceiver()`代码. (2认同)
  • @VipulKumar:它应该可以工作,主要是因为显式的`Intent`被用来向你的应用程序传递GCM消息.实际的GCM通信由Play服务流程管理.当它收到消息时,它会使用基于注册ID的查找(我推测)找到你的`BroadcastReceiver`,然后它会创建一个明确的`Intent`来获取消息给你.我们知道它必须是一个明确的"意图",否则每个人都会得到每个人的GCM消息.明确的"Intents"将应用程序移出停止状态. (2认同)