我正在开发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.
本质上,stationaryRegionReceiver
的 onReceive()
将在主 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/