即使用户强行closures它,如何自动重新启动服务?

我想要一个服务在我的应用程序中始终运行。 所以我想要重新启动它,即使它被用户强制closures。 当Facebook这样的应用程序正在这样做的时候,肯定有办法做到这一点(它没有使用推送通知,即使networkingclosures,Facebook也会重新启动服务)。

任何帮助,将不胜感激。 谢谢!

首先,强制服务于用户的意愿非常糟糕

无论如何,您可以通过使用处理从您的服务的onDestroy()发送的BroadcastReceiver重新启动它。

StickyService.java

 public class StickyService extends Service { private static final String TAG = "StickyService"; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand"); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeverKillMe")); } } 

RestartServiceReceiver.java

 public class RestartServiceReceiver extends BroadcastReceiver { private static final String TAG = "RestartServiceReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive"); context.startService(new Intent(context.getApplicationContext(), StickyService.class)); } } 

在清单文件中声明组件

  <service android:name=".StickyService" > </service> <receiver android:name=".RestartServiceReceiver" > <intent-filter> <action android:name="YouWillNeverKillMe" > </action> </intent-filter> </receiver> 

在组件中启动StickyService (即ApplicationActivityFragment ):

 startService(new Intent(this, StickyService.class)); 

要么

 sendBroadcast(new Intent("YouWillNeverKillMe")); 

你必须重写onTaskRemoved方法来创build一个sticky service ,在这里你可以设置一个警报服务来再次触发你的代码。

 public class BackgroundService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to start again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } 

同样在小米这样的设备中,Huwaei的应用程序一旦从最近的应用程序中删除,它就会closures。 这是因为制造商具有任务pipe理器function,可以提高内存/电池性能。

您可以检查此链接更多信息: https : //stackoverflow.com/a/41360159/2798289

每当一个服务被杀死,它的onDestroy方法总是被调用。 当它被杀死的时候,最好使用BroadcastReceiver来启动你的服务。

这里是一个示例代码说明其实施:

 @Override public void onDestroy() { Intent in = new Intent(); in.setAction("StartkilledService"); sendBroadcast(in); Log.d("debug", "Service Killed"); } 

然后在AndroidManifest.xml注册一个接收器:

 <receiver android:name=".app.ServiceDestroyReceiver" > <intent-filter> <action android:name="StartKilledService" > </action> </intent-filter> </receiver> 

最后,创build一个BroadcastReceiver ,并在onReceive方法中启动你的服务:

 @Override public void onReceive(Context context, Intent intent) { Log.d("debug", "ServeiceDestroy onReceive..."); Log.d("debug", "action:" + intent.getAction()); Log.d("debug", "Starting Service"); ServiceManager.startService(); } 

希望这可以帮助。

在服务的startCommand方法上返回START_STICKY。 通常它告诉操作系统在被杀死时启动服务。

根据Android文档

 Starting from Android 3.1, the system's package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications. Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states separately. FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential targets to resolve against. FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential targets. When neither or both of these flags is defined in an intent, the default behavior is to include filters of stopped applications in the list of potential targets. Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stopped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications. 

在应用程序的强制停止,Android只是杀死进程ID。 没有警告,callback服务/活动。 根据Android文档,应用程序被终止时,有可能调用onPause()。

当我尝试在我的应用程序,即使onPause()没有被调用。 我认为唯一的办法是使用FLAG_INCLUDE_STOPPED_PACKAGES意图标志,并从另一个应用程序发送

如果我理解正确,那么实际上这是不可能的,Androidfunction强制closures应用程序的目的是让用户摆脱不需要的应用程序,所以它不允许任何活动,直到用户再次启动其任何活动。

即使应用程序被强制停止,也要重新启动服务,即使在closures应用程序后,仍要继续在后台运行服务。

如果情况允许使用“根”,通常可以实施Humpty-Dumpty范式。

你的应用程序(第一)安装另一个应用程序(第二,从资产采取APK),并运行第二个应用程序的服务。 第二个应用程序的服务绑定到第一个应用程序服务,并重新绑定时断开连接。 第一个应用程序也是一样的。

当所有的应用程序都被一些免费的RAM或类似的应用程序所杀,但是当Android杀死其中的任何一个时,另一个应该会重启对应的程序。

保持服务运行,甚至强制停止服务都是一个非常黑客的解决scheme。 我不build议这样做,因为这是违反用户意愿的。 你可以定义一个广播接收器来接收你的服务的动作X. onStartCommand处理器的意图,广播X(如果服务尚未启动)。 在广播接收机收到X后,首先启动服务,然后,hibernate几分钟,最后重新播放X.

我认为这里唯一的万无一失的解决scheme是在分开的进程(清单中的服务条目中的android:process="somecustomprocessname" )中有两个服务,它们都监听广播并重启对方,因为目前的UI不让用户在一个动作中杀死多个进程。 然后,您可以在每个服务中设置一个pinger线程,检查其他服务是否每100毫秒左右运行一次,如果不是,则尝试重新启动它。 但是这开始越来越像恶意软件

保持服务的唯一真正的解决scheme是使用提供的通知来调用Service.startForeground(...) 。 这将是唯一有效的解决scheme,另一个将非常依赖谷歌将如何改变其系统的行为。 随着每次API更新,Google都可以防止其他黑客入侵。

这也让用户意识到,你的应用程序正在执行一些后台任务,这将保持应用程序的活着,用户必须停止这一点。 但是,如果您提供用户阻止它的能力,那么它就是您的应用程序的一部分。

请参阅文档:

 void startForeground (int id, Notification notification) 

使该服务在前台运行,在此状态下向用户提供正在显示的正在进行的通知。 默认情况下,服务是后台服务,这意味着如果系统需要杀死它们来回收更多的内存(比如在Web浏览器中显示一个大页面),那么它们可以被杀死,而不会造成太大的伤害。 您可以设置此标志,如果杀死您的服务会对用户造成干扰,比如您的服务正在执行背景音乐播放,则用户会注意他们的音乐是否停止播放。