0

我的问题是,当 IM 按下主页按钮并关闭我的应用程序时,后台服务停止,之后它需要在应用程序中再次登录,然后后台服务将启动,所以如果应用程序将关闭或 Kiiled 那么我该怎么做就像 Whatssapp 一样服务可以在后台运行.....

4

3 回答 3

4

我有同样的问题。当您将应用程序刷出应用程序托盘时,后台服务的进程将被终止。

您可以在您的服务中添加以下代码或查看问题

@Override
public void onTaskRemoved(Intent rootIntent){
   Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
   restartServiceIntent.setPackage(getPackageName());

   PendingIntent restartServicePendingIntent =  PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
   AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
   alarmService.set(
      AlarmManager.ELAPSED_REALTIME,
      SystemClock.elapsedRealtime() + 1000,
      restartServicePendingIntent);

   super.onTaskRemoved(rootIntent);
}

这段代码的作用是,当您的活动被终止时,它会在它被终止后重新启动应用程序的进程。

于 2014-03-17T20:27:31.103 回答
2

它非常简单,只需按照以下链接中的场景进行操作即可。

即使应用程序从最近的应用程序中清除,也继续服务

您的服务和流程(在您的服务内运行的线程)将保持连续。

于 2017-08-07T13:08:52.093 回答
0

好的,我只是猜测 - 真的不想检查您的应用程序的所有代码。

服务可以通过两种方式启动:

  1. 使用 bindService() 你可能在这里做什么。这很好,但意味着服务将在最后一个客户端解除绑定后立即处理(您可能在某些 onPause() 方法中执行此操作。
  2. 使用 startService() 命令。在这种情况下,只要您停止它,服务就会运行,或者系统会认为该服务正在使用大量内存,应该用于一些更紧急的任务(例如:一些肥胖活动)

您的问题的快速解决方案(如果我的猜测是正确的)将切换服务以在“startService”模式下运行。如果您不想过多地使用您的代码,最好放置它的位置是您的服务的 onBind() 方法(只需尝试从自身启动服务)。当然,这不会启动服务,但会将其模式切换为“长时间运行,真正的后台模式”。这并不能解决我上面提到的所有问题 - 服务仍然可以被系统杀死以获得更多资源。您可以通过某些方式阻止它:如果您真的想保持服务运行,您应该考虑使用前台服务(google it),这将增加服务生存的机会。但最好的选择是使用服务生命周期,如果需要保存数据并在服务启动时加载它们,就像你应该做的活动一样。对于长时间运行的后台服务,还有一个选项 start sticky 会导致服务在每次杀死、崩溃等后启动。

于 2014-03-17T20:15:30.667 回答