当应用程序被杀死然后重新启动时,Android服务(在它自己的线程中)就会死掉

时间:2015-04-21 19:48:02

标签: java android multithreading service bind

我几个星期以来一直在努力解决这个问题。我对Android很新,希望你能帮我一臂之力。

我有这个服务,它运行在一个单独的线程而不是应用程序。本质上,用户指示它启动,它应该保持活着,直到用户告诉它停止或直到它达到其目的 - 它在需要时安排自己的销毁(停止)。该服务需要保持活力,因为它包含重要的优先级相关信息,所以我不能在需要时转向警报管理器来恢复它 - 尽管我确实将警报管理器用于其他目的。我有两个问题:

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

        

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

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;
}

如果您需要更多数据/信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

通过在onBind中重新绑定活页夹,您将创建一个绑定服务,这意味着它已被绑定"到你的应用程序。这意味着当你的应用程序执行时它会被破坏,这解释了主页按钮的破坏。您应该为后台服务返回 null

@Override
public void onCreate() {
//keeps being called thus I lose my data
 }
@Override
public IBinder onBind(Intent intent) {
    return null;
}

您应该使用START_STICKY标志启动服务,这样如果操作系统在资源不足时销毁您的服务,它将在以后重新创建它。

在销毁您的服务之前,Android会拨打public void onLowMemory(),保存您需要的所有数据,以便在重新启动服务时,您可以再次执行任务。

编辑:根据您的评论,您希望在后台运行并且还允许绑定的服务。如果在进行任何startService()调用之前调用bindService()方法,则可以执行此操作...这将有效地使您的服务成为已启动的服务而非绑定。在这种情况下,您可以返回IBInder并绑定到它。

有一篇非常非常好的文章HERE