Android广播接收器在应用关闭时未执行

6
我有一个安卓应用程序,使用Alarm Manager调度事件(位置更新)在未来执行。只要应用在前台或后台运行,预定的事件就能按预期执行。但是,一旦我在任务管理器中强制关闭应用程序或者当安卓系统由于内存问题在后台杀掉应用程序时,我将无法再接收来自Alarm Manager的广播。
根据各种帖子和博客的建议,我尝试使用以下方法: 1. Intent.Flag_Include_Stopped_Packages 2. 在清单文件中添加接收器android:process=":remote" 3. 在清单文件中添加接收器android:exported="true"
在服务中:
Intent locationIntent = new Intent("com.dummy.intent");  
locationIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
locationIntent.putExtra(LocationLibraryConstants.LOCATION_BROADCAST_EXTRA_LOCATIONINFO, locationInfo);
context.sendBroadcast(locationIntent, "android.permission.ACCESS_FINE_LOCATION");

在清单文件中:
<receiver android:name=".NearestStationBroadcastReceiver" android:enabled="true"
  android:exported="true" 
  android:process=":remote">
    <intent-filter>
        <action android:name="com.dummy.intent" />
    </intent-filter>
</receiver>

有人能帮我解决一下问题吗?

2个回答

5
但是,一旦我在任务管理器中强制关闭应用程序或当安卓系统在应用程序处于后台时由于内存问题而终止应用程序时,我就无法再接收到闹钟管理器发送的广播。
这两者毫无关系,所以如果您一直在使用“强制停止”模拟“当安卓系统由于内存问题而终止应用程序”的情况,那就是您的问题。通过设置强制停止的应用程序会移除其闹钟等内容。更好的模拟进程被终止的方法是从DDMS中终止它。
1)Intent.Flag_Include_Stopped_Packages 2)清单文件中的receiver android:process=":remote" 3)清单文件中的receiver android:exported="true"
以上三个与您的问题无关,而android:exported="true"(以及您对的使用)会引起安全问题,因为现在任何人都可以在任何时间出于任何原因运行您的BroadcastReceiver。 这里有一个示例应用程序,即使在DDMS终止进程后仍然可以成功处理闹钟事件。

感谢您的回答。 - user3047032
但是我没有在模拟器上模拟这种情况,而是在实际设备上安装应用程序。当我启动监听位置的闹钟并且应用程序几分钟后移动到非活动状态(通过打开其他应用程序),安卓系统会停止我的位置应用程序后台运行。然后,在闹钟间隔服务重新启动并发送位置更新信息的意图时。但是在应用程序清单中定义的广播接收器不会触发。当应用程序在后台可用时,以上工作完美。希望你明白我的意思。 - user3047032
非常感谢您分享这个示例,我已经苦苦挣扎了几天,感谢您挽救了我的一天! - Naga
虽然不相关,但是我在使用同一接收器类处理不同闹钟时遇到了一个问题,如果我使用不同的类就没有问题,发生了一些愚蠢的事情,但我最终不得不添加更多的接收器类。 - Naga

0

您需要将应用程序添加到手机的Android设置>受保护的应用程序部分。这样用户就可以控制允许在后台运行哪些应用程序。

如果您获得了必要的权限,还可以编写一个服务来监听位置广播,该服务将在后台运行而不会出现问题。


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