当前位置: 首页 > 知识库问答 >
问题:

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

荆钱明
2023-03-14

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

基本上,这是一个cordova插件,它使用LocationManager向WebView发送位置。

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

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

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)后,服务重新启动并正常运行。但为什么它一开始就坠毁了呢?当服务存在于自己的线程中时,为什么会出现发送广播失败的情况?而为什么自动重启后不会再死机呢?

共有1个答案

韦德厚
2023-03-14

我建议您在DistanceFilterLocationService.java的onCreate()中检查代码中的这些行(或因此激发的任何意图):

...
// 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。在主应用程序线程中,将使用与筛选器匹配的任何广播意图调用接收器。

您还可以使用这篇文章来测试一部分代码在什么线程中运行:如何检查当前线程是否不是主线程。

 类似资料:
  • 我正在尝试发送广播,但从未被调用。 该服务打印以下Toast消息()- “已创建服务” 这对于很好,但是对于: 该服务仅打印以下Toast消息()- “已创建服务”

  • 当我收到一条消息,我正在用谷歌服务从我的桌面发送到我的Android系统时,我正在用谷歌服务进行广播,在广播后,我的应用程序崩溃了,我的日志被切断了 我的GCM服务类公共类GCMIntentService扩展了GCMBaseIntentService{ 我的显示消息函数公共静态无效displayMessage(上下文,字符串消息){Intent意图=new Intent(DISPLAY_MESSA

  • 11.4.发送广播 最后,为触发这个事件,我们需要广播一条能够匹配filter的Intent。前面的BootReceiver只管接收来自系统的广播,也就没必要负责发送Intent。但对TimelineReceiver来说,它接收的广播是来自应用程序本身,发送Intent也就需要我们自己负责了。 在第八章 Service 中,我们为UpdaterService创建了一个内部类Updater,负责在独

  • 我想要实现的是: user1向服务器发送消息(一个简单的POST请求) 服务器部分是(events.php) 我在(true)时尝试了无限循环以避免3秒的轮询。我也尝试过没有那个无限循环。只有发送消息的用户收到事件。 我理解这种做法并不好。但是,将SSE用于聊天应用程序的最佳实践是什么? 如何向所有用户发送事件?

  • 问题内容: 我需要向连接到网络的所有计算机(服务器)发送广播数据报。 我正在使用NodeJS组播 客户 伺服器 谢谢。 问题答案: 我从未使用过Node.js,但我确实记得,使用Berkely套接字(这似乎是套接字使用最广泛的实现),您需要启用socket选项才能将数据报发送到广播地址。查找文档,似乎有一个功能。 您可能想以编程方式找到广播地址,但是我无法为您提供帮助。

  • DALVIK线程:(互斥:TLL=0 TSL=0 TSCL=0 GHL=0) 后台进程prio=5 tid=15 WAIT group=“main”scount=1 dscount=0 obj=0x4216e7e0 self=0x400b6a18 systid=24414 nice=0 sched=0/0 cgrp=apps handle=1074723664 state=s schedstat=