一只斗牛犬
最近,我对您遇到的同样问题感到困惑。但是现在,我找到了一个很好的解决方案。首先,您应该知道,即使您的服务已被OS杀死,您的服务的onCreate方法也将在短时间内被OS调用。因此,您可以使用onCreate方法执行以下操作:@Overridepublic void onCreate() { Log.d(LOGTAG, "NotificationService.onCreate()..."); //start this service from another class ServiceManager.startService();}@Overridepublic void onStart(Intent intent, int startId) { Log.d(LOGTAG, "onStart()..."); //some code of your service starting,such as establish a connection,create a TimerTask or something else}“ ServiceManager.startService()”的内容为:public static void startService() { Log.i(LOGTAG, "ServiceManager.startSerivce()..."); Intent intent = new Intent(NotificationService.class.getName()); context.startService(intent);}但是,此解决方案仅适用于您的服务被GC终止的情况。有时我们的服务可能会被程序管理器的用户终止。在这种情况下,您的职业将被杀死,并且您的服务将永远不会被实例化。因此,您的服务无法重新启动。但是好消息是,当PM终止您的服务时,它将调用您的onDestroy方法。因此我们可以使用该方法来做些事情。 @Overridepublic void onDestroy() { Intent in = new Intent(); in.setAction("YouWillNeverKillMe"); sendBroadcast(in); Log.d(LOGTAG, "onDestroy()...");}字符串“ YouWillNeverKillMe”是一个自定义操作。此方法最重要的是,在发送广播之前不要添加任何代码。由于系统不会等待onDestroy()的完成,因此必须尽快发送广播。然后在manifast.xml中注册一个接收者:<receiver android:name=".app.ServiceDestroyReceiver" > <intent-filter> <action android:name="YouWillNeverKillMe" > </action> </intent-filter> </receiver>最后,创建一个BroadcastReceiver,并使用onReceive方法启动服务:@Overridepublic void onReceive(Context context, Intent intent) { Log.d(LOGTAG, "ServeiceDestroy onReceive..."); Log.d(LOGTAG, "action:" + intent.getAction()); Log.d(LOGTAG, "ServeiceDestroy auto start service..."); ServiceManager.startService();}希望这对您有所帮助,请原谅我那可怜的英语。