强制停止后服务仍然存在
Service still alive after force stop
我想知道在用户强行关闭应用程序后服务保持正常运行是否是正常行为。
我的应用程序使用绑定服务在后台处理蓝牙通信,效果很好。在我的服务的 onCreate 方法中,我检查了我的 Sqlite 数据库中的一些内容,但是如果应用程序被强制关闭,数据库显然无法访问。
所以当我强制停止应用程序时,几秒钟后,服务在尝试从数据库读取时崩溃。现在我可以写 try/catch 来检查我的 SQLiteOpenHelper 是否为空,但我宁愿我的服务停止在 "force close" 操作上,并避免触发 onCreate 方法。
该应用程序和服务在其他方面都运行良好,但是 UI 错误消息让我很烦恼。
Process: (Package), PID: 24030
java.lang.RuntimeException: Unable to create service
(Package).TraitementsAsync.ServiceComm:
java.lang.NullPointerException
at
android.app.ActivityThread.handleCreateService(ActivityThread.java:2746)
at android.app.ActivityThread.access00(ActivityThread.java:169)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5476)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at
(Package).service.ServiceBdd.getParametre(ServiceBdd.java:414)
at
(Package).service.ServiceTipe.getParametre(ServiceTipe.java:699)
at
(Package).TraitementsAsync.ServiceComm.onCreate(ServiceComm.java:83)
at
android.app.ActivityThread.handleCreateService(ActivityThread.java:2736)
at android.app.ActivityThread.access00(ActivityThread.java:169)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5476)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
根据问题,这绝对是一种不正常的行为,尤其是因为服务正在上升 NullPointerException
(NPE)。 Android 服务用于计算一组可以同步或不同步(异步)的任务。此外,在这两种情况下,开发人员都有责任实现非阻塞和线程安全机制。
正如我们在 Android 的页面上看到的那样,
(...) start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC) (...)
此外,Android 的文档说:
A service is "started" when an application component (such as an activity) starts it by calling startService(). Once started, a service can run in the background indefinitely, even if the component that started it is destroyed
因此,检查在方法 onStartCommand()
上实现的行为(算法)非常重要,在这种情况下,服务可以 运行 无限期地在后台运行。如果你实现了这个,你有责任在服务完成后通过调用 stopSelf()
或 stopService()
.
来停止服务。
查看 Android service page 了解完整详情。
我想知道在用户强行关闭应用程序后服务保持正常运行是否是正常行为。
我的应用程序使用绑定服务在后台处理蓝牙通信,效果很好。在我的服务的 onCreate 方法中,我检查了我的 Sqlite 数据库中的一些内容,但是如果应用程序被强制关闭,数据库显然无法访问。
所以当我强制停止应用程序时,几秒钟后,服务在尝试从数据库读取时崩溃。现在我可以写 try/catch 来检查我的 SQLiteOpenHelper 是否为空,但我宁愿我的服务停止在 "force close" 操作上,并避免触发 onCreate 方法。
该应用程序和服务在其他方面都运行良好,但是 UI 错误消息让我很烦恼。
Process: (Package), PID: 24030
java.lang.RuntimeException: Unable to create service (Package).TraitementsAsync.ServiceComm: java.lang.NullPointerException at android.app.ActivityThread.handleCreateService(ActivityThread.java:2746) at android.app.ActivityThread.access00(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5476) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at (Package).service.ServiceBdd.getParametre(ServiceBdd.java:414) at (Package).service.ServiceTipe.getParametre(ServiceTipe.java:699) at (Package).TraitementsAsync.ServiceComm.onCreate(ServiceComm.java:83) at android.app.ActivityThread.handleCreateService(ActivityThread.java:2736) at android.app.ActivityThread.access00(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5476) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) at dalvik.system.NativeStart.main(Native Method)
根据问题,这绝对是一种不正常的行为,尤其是因为服务正在上升 NullPointerException
(NPE)。 Android 服务用于计算一组可以同步或不同步(异步)的任务。此外,在这两种情况下,开发人员都有责任实现非阻塞和线程安全机制。
正如我们在 Android 的页面上看到的那样,
(...) start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC) (...)
此外,Android 的文档说:
A service is "started" when an application component (such as an activity) starts it by calling startService(). Once started, a service can run in the background indefinitely, even if the component that started it is destroyed
因此,检查在方法 onStartCommand()
上实现的行为(算法)非常重要,在这种情况下,服务可以 运行 无限期地在后台运行。如果你实现了这个,你有责任在服务完成后通过调用 stopSelf()
或 stopService()
.
查看 Android service page 了解完整详情。