首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前台服务onTaskRemoved发送广播意图android.os.DeadObjectException失败

前台服务onTaskRemoved发送广播意图android.os.DeadObjectException失败
EN

Stack Overflow用户
提问于 2015-12-20 00:04:08
回答 3查看 1.4K关注 0票数 2

我正在开发https://github.com/mauron85/cordova-plugin-mauron85-background-geolocation-phonegapbuild

基本上它是cordova插件,它使用LocationManager将位置发送到webview。

内核被实现为android.app.Service,它在前台启动,以减少被os杀死的机会。

服务也有自己的进程(android:process=":remote")。因此服务将终止主要活动(线程)或关闭用户应用程序。即使被杀死,它也会通过在onStartCommand中设置标志START_REDELIVER_INTENT来自动重启。

我的问题是,在应用程序关闭后(从任务lisk刷走),服务在几秒钟后崩溃。在日志中我看到:

代码语言:javascript
复制
W/BroadcastQueue(  562): Failure sending broadcast Intent { act=com.tenforwardconsulting.cordova.bgloc.STATIONARY_REGION_ACTION flg=0x10 (has extras) }
W/BroadcastQueue(  562): android.os.DeadObjectException
W/BroadcastQueue(  562):    at android.os.BinderProxy.transactNative(Native Method)
W/BroadcastQueue(  562):    at android.os.BinderProxy.transact(Binder.java:496)
W/BroadcastQueue(  562):    at android.app.ApplicationThreadProxy.scheduleRegisteredReceiver(ApplicationThreadNative.java:1093)
W/BroadcastQueue(  562):    at com.android.server.am.BroadcastQueue.performReceiveLocked(BroadcastQueue.java:431)
W/BroadcastQueue(  562):    at com.android.server.am.BroadcastQueue.deliverToRegisteredReceiverLocked(BroadcastQueue.java:521)
W/BroadcastQueue(  562):    at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:729)
W/BroadcastQueue(  562):    at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:149)
W/BroadcastQueue(  562):    at android.os.Handler.dispatchMessage(Handler.java:102)
W/BroadcastQueue(  562):    at android.os.Looper.loop(Looper.java:135)
W/BroadcastQueue(  562):    at android.os.HandlerThread.run(HandlerThread.java:61)
W/BroadcastQueue(  562):    at com.android.server.ServiceThread.run(ServiceThread.java:46)
W/ActivityManager(  562): Scheduling restart of crashed service com.xpressgo.courier.cordova/com.tenforwardconsulting.cordova.bgloc.DistanceFilterLocationService in 82050ms
W/ActivityManager(  562): Scheduling restart of crashed service com.xpressgo.courier.cordova/com.tenforwardconsulting.cordova.bgloc.FusedLocationService in 97188832ms

然后在一段时间(97188832ms)后,服务重新启动并正常运行。但是为什么它一开始就崩溃了呢?当服务在自己的线程中时,为什么发送广播会失败?为什么自动重启后不会再次崩溃?

EN

回答 3

Stack Overflow用户

发布于 2015-12-28 19:04:28

我建议您在onCreate() of DistanceFilterLocationService.java的代码中检查以下代码行(或任何因此而触发的意图):

代码语言:javascript
复制
...
// Stationary region PI
stationaryRegionPI  = PendingIntent.getBroadcast(this, 0, new Intent(STATIONARY_REGION_ACTION), PendingIntent.FLAG_CANCEL_CURRENT);
registerReceiver(stationaryRegionReceiver, new IntentFilter(STATIONARY_REGION_ACTION));
...

根据registerReceiver(BroadcastReceiver receiver, IntentFilter filter)的官方文档:

注册一个要在中主活动线程中运行的BroadcastReceiver。接收器将被任何与主应用程序线程中的filter、匹配的广播意图调用。

实际上,stationaryRegionReceiveronReceive()将在主UI线程上运行,如果你的应用程序关闭,主UI线程就会消失。

你也可以使用这篇文章来测试一部分代码在哪个线程中运行:How to check if current thread is not main thread

票数 1
EN

Stack Overflow用户

发布于 2016-01-31 06:24:00

我相信这是this bug的原因。

最近的Android版本中有一个bug,没有任何绑定到活动的服务将在收到任何意图广播时被终止(无论服务处于单独的进程中)。有一些丑陋的变通方法(实际上我自己也做了一个),但没有什么我可以真正推荐的。谢天谢地,android会在一段时间后自动重启服务。

票数 1
EN

Stack Overflow用户

发布于 2017-02-06 22:29:18

我来晚了点,但也许这对某些人还是有用的。我发现这可能是与KitKat和更新版本相关的问题。解决方法是使用以下代码:

代码语言:javascript
复制
AlarmManager manager = (AlarmManager) MyContext.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(MyContext, MyBroadcastReceiver.class);
alarmIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
PendingIntent myPendingIntent = PendingIntent.getBroadcast(MyContext, 1, alarmIntent, 0);

我读到了一些关于副作用的东西,但我对上面的解决方案没有问题。

参考:Issue 53313

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34372648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档