【问题标题】:Service still alive after force stop强制停止后服务仍然存在
【发布时间】:2016-03-24 17:11:31
【问题描述】:

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

我的应用使用绑定服务在后台处理蓝牙通信,效果很好。在我的服务的 onCreate 方法中,我检查了我的 Sqlite DB 中的一些内容,但如果应用程序被强制关闭,则数据库显然无法访问。

因此,当我在几秒钟后强制停止应用程序时,服务在尝试从数据库读取时崩溃。现在我可以编写 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) 在 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(本机方法) 引起: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) 在 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(Native Method)

【问题讨论】:

  • 你从onStartCommand返回什么?
  • 我返回 start_sticky
  • developer.android.com/reference/android/app/…'''if this service's process is killed while it is started (after returning from onStartCommand(Intent, int, int)), then leave it in the started state but don't retain this delivered intent. Later the system will try to re-create the service.'''
  • 请不要发布您的实际包裹。我已经为你审查了。

标签: java android android-service


【解决方案1】:

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

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

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

此外,Android 的文档说:

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

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

查看Android service page 了解完整详情。

【讨论】:

  • 文档还说:“服务在其托管进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有说明)”。感谢有关 onStartCommand() 的提示,它正在返回 START_STICKY,这显然使系统触发服务的 onCreate 以在应用程序被销毁后重新创建它。谢谢,它解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多