强制停止后服务仍然有效

时间:2016-03-24 17:11:31

标签: java android android-service

我想知道,在用户强行关闭应用程序后服务保持正常是正常行为。

我的应用程序使用绑定服务在后台处理蓝牙通信,效果非常好。在我的服务的onCreate方法中,我去检查我的Sqlite数据库中的一些东西,但如果应用程序被强制关闭,那么数据库显然无法访问。

因此,当我强制停止应用程序时,几秒钟后,服务在尝试从数据库读取时崩溃。现在我可以编写try / catch来检查我的SQLiteOpenHelper是否为空,但我宁愿我的服务停止“强制关闭”操作,并避免触发onCreate方法。

除此之外,应用程序和服务都运行良好,但是这个UI错误消息让我感到困惑。

  

处理:(包),PID:24030

     

java.lang.RuntimeException:无法创建服务   (包).TraitementsAsync.ServiceComm:   显示java.lang.NullPointerException                                                                           在   android.app.ActivityThread.handleCreateService(ActivityThread.java:2746)                                                                           在android.app.ActivityThread.access $ 1900(ActivityThread.java:169)                                                                           在   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1359)                                                                           在android.os.Handler.dispatchMessage(Handler.java:102)                                                                           在android.os.Looper.loop(Looper.java:136)                                                                           在android.app.ActivityThread.main(ActivityThread.java:5476)                                                                           at java.lang.reflect.Method.invokeNative(Native Method)                                                                           在java.lang.reflect.Method.invoke(Method.java:515)                                                                           在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1268)                                                                           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)                                                                           at dalvik.system.NativeStart.main(Native Method)                                                                        引起:java.lang.NullPointerException                                                                           在   (包).service.ServiceBdd.getParametre(ServiceBdd.java:414)                                                                           在   (包).service.ServiceTipe.getParametre(ServiceTipe.java:699)                                                                           在   (包).TraitementsAsync.ServiceComm.onCreate(ServiceComm.java:83)                                                                           在   android.app.ActivityThread.handleCreateService(ActivityThread.java:2736)                                                                           在android.app.ActivityThread.access $ 1900(ActivityThread.java:169)                                                                           在   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1359)                                                                           在android.os.Handler.dispatchMessage(Handler.java:102)                                                                           在android.os.Looper.loop(Looper.java:136)                                                                           在android.app.ActivityThread.main(ActivityThread.java:5476)                                                                           at java.lang.reflect.Method.invokeNative(Native Method)                                                                           在java.lang.reflect.Method.invoke(Method.java:515)                                                                           在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1268)                                                                           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)                                                                           在dalvik.system.NativeStart.main(本地方法)

1 个答案:

答案 0 :(得分:0)

根据这个问题,这绝对是一种不正常的行为,特别是因为服务正在上升NullPointerException(NPE)。 Android服务用于计算一组可以同步或不同步的任务(异步)。此外,在这两种情况下,开发人员都有责任实现非阻塞和线程安全的机制。

正如我们在Android的页面上看到的那样,

  

(...)启动服务,即使用户切换到另一个应用程序,它也将继续在后台运行。此外,组件可以绑定到服务以与其交互,甚至执行进程间通信(IPC)(...)

此外,Android的文档说:

  

服务已经开始"当应用程序组件(例如活动)通过调用startService()启动它时。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被销毁

因此,检查在方法onStartCommand()上实现的行为(算法)非常重要,在这种情况下,服务可以无限期地在后台运行。如果您实施此功能,则您有责任在工作完成后停止服务,方法是致电stopSelf()stopService()

检查Android service page以查看详细信息。