android - 前台服务 onTaskRemoved 发送广播 Intent 失败 android.os.DeadObjectException

标签 android cordova webview android-service locationmanager

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

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

核心是作为 android.app.Service 实现的,它在前台启动,以减少被操作系统杀死的机会。

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

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

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)服务重新启动并正常运行。但为什么它一开始就崩溃了呢?当服务位于自己的线程中时,为什么发送广播失败?为什么自动重启后不会再崩溃?

最佳答案

我建议您在 DistanceFilterLocationService.java 的 onCreate() 中查看代码中的这些行(或由此引发的任何 Intent ):

...
// 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)的官方文档:

Registers a BroadcastReceiver to be run in the main activity thread. The receiver will be called with any broadcast Intent that matches filter, in the main application thread.

本质上,stationaryRegionReceiveronReceive() 将在主 UI 线程上运行,如果您的应用关闭,该线程应该消失。 探索这个,registerReceiver (BroadcastReceiver receiver, IntentFilter filter, Handler handler)

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

关于android - 前台服务 onTaskRemoved 发送广播 Intent 失败 android.os.DeadObjectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34372648/

相关文章:

ios - 无法安装 PhoneGap macOS(桌面应用程序)

android - 未知的 URL 方案

java - 待办事项 应用程序崩溃

android - 如何在 Android 中合并音频和视频文件

java - 保存数组数据

Javascript 在 Canvas 上绘制并将其与视频合并并一起保存

Android Phonegap/Webkit/Viewport 位置固定

webview - 在 Android TV 上升级 Android WebView 后,不再播放 hls 264 视频

macos - 尝试制作一个选项卡式浏览器

android - 在 SIPDROID 中更改服务器