Java Android服务(在它自己的线程中)在应用程序被终止后死亡,然后重新启动

Java Android服务(在它自己的线程中)在应用程序被终止后死亡,然后重新启动,java,android,multithreading,service,bind,Java,Android,Multithreading,Service,Bind,我已经为这个问题挣扎了好几个星期了。我是Android的新手,希望你能帮我一把 我有这项服务,它运行在应用程序之外的单独线程上。本质上,用户指示它启动,并且它应该保持活动状态,直到用户告诉它停止,或者直到它达到了它的目的——它在需要时安排自己的销毁(停止)。该服务需要保持活动状态,因为它保存着重要的优先级相关信息,因此我不能在需要时简单地求助于alarm manager来恢复它——尽管我确实将alarm manager用于其他目的。我有两个问题: 首先,当用户关闭应用程序(通过按住中间按钮并关

我已经为这个问题挣扎了好几个星期了。我是Android的新手,希望你能帮我一把

我有这项服务,它运行在应用程序之外的单独线程上。本质上,用户指示它启动,并且它应该保持活动状态,直到用户告诉它停止,或者直到它达到了它的目的——它在需要时安排自己的销毁(停止)。该服务需要保持活动状态,因为它保存着重要的优先级相关信息,因此我不能在需要时简单地求助于alarm manager来恢复它——尽管我确实将alarm manager用于其他目的。我有两个问题:

  • 首先,当用户关闭应用程序(通过按住中间按钮并关闭应用程序)时,服务被破坏,这意味着我丢失了数据(我假设它在自动重新启动时被破坏)
  • 其次,它会重新启动自身,从而导致数据被重新加载,因此,我丢失了数据

对于活动,它通过以下方式绑定到服务器:

private void startService() {
    startService(new Intent(this, CES.class));
    bindService(new Intent(this, CES.class), mConnection, 0);
}
最后,服务中的相关(或至少是我认为相关的)方法:

private final IBinder mBinder = new ICESInterface.Stub() { ..... }
@Override
public void onCreate() {
//keeps being called thus I lose my data }
@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent,flags,startId);
    //return START_STICKY;
}

如果您需要更多数据/信息,请告诉我。

通过在onBind中重新使用活页夹,您正在创建一个绑定服务,这意味着它已“绑定”到您的应用程序。这意味着当你的应用程序被破坏时,它会被破坏,这解释了home按钮被破坏的原因。对于后台服务,您应该返回null

@Override
public void onCreate() {
//keeps being called thus I lose my data
 }
@Override
public IBinder onBind(Intent intent) {
    return null;
}
您应该使用flag启动服务,这样,如果操作系统在资源不足时破坏了您的服务,它将在以后重新创建它

在销毁您的服务之前,Android将调用
public void onLowMemory()
,在那里保存您需要的任何数据,以便在重新启动服务时,您能够再次执行任务

编辑:根据您的评论,您需要一个在后台运行且允许绑定的服务。如果在进行任何
bindService()
调用之前调用
startService()
方法,就可以这样做。。。这将有效地使您的服务成为已启动的服务,而不是绑定的服务。在这种情况下,您可以返回一个
IBInder
并绑定到它


有一篇非常非常好的文章

我正在使用它返回一个用于AIDL通信的活页夹。不管是什么原因-当绑定服务不再绑定任何客户端时,绑定服务将被销毁。关于如何解决AIDL部分,有什么想法吗?意思是,让它无限期运行,但仍然允许AIDL通信-因为我无法返回活页夹/存根。您确定需要AIDL吗?AIDL使您的服务“公开”我想我可以这样做,因为这部分文档让我感到困惑(显然,同时只支持其中一个选项):“虽然此文档通常分别讨论这两种类型的服务,但您的服务可以以两种方式启动(无限期运行)而且还允许绑定。这只是一个是否实现两个回调方法的问题:onStartCommand()允许组件启动它,onBind()允许绑定。“我建议您删除onStartCommand方法,如果您使用它只是返回start\u STICKY或super.onStartCommand(…)。原因是,这是由上层社会的Android自动完成的(如果你看一下你将看到的源代码),如果一个应用程序真的被杀死(而不是一个活动被销毁),那么这个过程中的一切都会消失。假定仍在运行的服务将在新进程中重新创建。@ChrisStratton-该服务已在单独的线程上运行。您已经提到了这一点,但这并不重要-当进程被终止时,它的所有线程也将被终止。