我正在开发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刷走),服务在几秒钟后崩溃。在日志中我看到:
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)后,服务重新启动并正常运行。但是为什么它一开始就崩溃了呢?当服务在自己的线程中时,为什么发送广播会失败?为什么自动重启后不会再次崩溃?
发布于 2015-12-28 19:04:28
我建议您在onCreate() of DistanceFilterLocationService.java的代码中检查以下代码行(或任何因此而触发的意图):
...
// 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、匹配的广播意图调用。
实际上,stationaryRegionReceiver的onReceive()将在主UI线程上运行,如果你的应用程序关闭,主UI线程就会消失。
你也可以使用这篇文章来测试一部分代码在哪个线程中运行:How to check if current thread is not main thread。
发布于 2016-01-31 06:24:00
我相信这是this bug的原因。
最近的Android版本中有一个bug,没有任何绑定到活动的服务将在收到任何意图广播时被终止(无论服务处于单独的进程中)。有一些丑陋的变通方法(实际上我自己也做了一个),但没有什么我可以真正推荐的。谢天谢地,android会在一段时间后自动重启服务。
发布于 2017-02-06 22:29:18
我来晚了点,但也许这对某些人还是有用的。我发现这可能是与KitKat和更新版本相关的问题。解决方法是使用以下代码:
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
https://stackoverflow.com/questions/34372648
复制相似问题