我的问题是,当 IM 按下主页按钮并关闭我的应用程序时,后台服务停止,之后它需要在应用程序中再次登录,然后后台服务将启动,所以如果应用程序将关闭或 Kiiled 那么我该怎么做就像 Whatssapp 一样服务可以在后台运行.....
问问题
7917 次
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
好的,我只是猜测 - 真的不想检查您的应用程序的所有代码。
服务可以通过两种方式启动:
- 使用 bindService() 你可能在这里做什么。这很好,但意味着服务将在最后一个客户端解除绑定后立即处理(您可能在某些 onPause() 方法中执行此操作。
- 使用 startService() 命令。在这种情况下,只要您停止它,服务就会运行,或者系统会认为该服务正在使用大量内存,应该用于一些更紧急的任务(例如:一些肥胖活动)
您的问题的快速解决方案(如果我的猜测是正确的)将切换服务以在“startService”模式下运行。如果您不想过多地使用您的代码,最好放置它的位置是您的服务的 onBind() 方法(只需尝试从自身启动服务)。当然,这不会启动服务,但会将其模式切换为“长时间运行,真正的后台模式”。这并不能解决我上面提到的所有问题 - 服务仍然可以被系统杀死以获得更多资源。您可以通过某些方式阻止它:如果您真的想保持服务运行,您应该考虑使用前台服务(google it),这将增加服务生存的机会。但最好的选择是使用服务生命周期,如果需要保存数据并在服务启动时加载它们,就像你应该做的活动一样。对于长时间运行的后台服务,还有一个选项 start sticky 会导致服务在每次杀死、崩溃等后启动。
于 2014-03-17T20:15:30.667 回答