我想知道,在用户强行关闭应用程序后服务保持正常是正常行为。
我的应用程序使用绑定服务在后台处理蓝牙通信,效果非常好。在我的服务的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(本地方法)
答案 0 :(得分:0)
根据这个问题,这绝对是一种不正常的行为,特别是因为服务正在上升NullPointerException
(NPE)。 Android服务用于计算一组可以同步或不同步的任务(异步)。此外,在这两种情况下,开发人员都有责任实现非阻塞和线程安全的机制。
正如我们在Android的页面上看到的那样,
(...)启动服务,即使用户切换到另一个应用程序,它也将继续在后台运行。此外,组件可以绑定到服务以与其交互,甚至执行进程间通信(IPC)(...)
此外,Android的文档说:
服务已经开始"当应用程序组件(例如活动)通过调用startService()启动它时。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被销毁
因此,检查在方法onStartCommand()
上实现的行为(算法)非常重要,在这种情况下,服务可以无限期地在后台运行。如果您实施此功能,则您有责任在工作完成后停止服务,方法是致电stopSelf()
或stopService()
。
检查Android service page以查看详细信息。