近日來,我在倒騰360手機衛士的時候,發現,你不管是把他數據清空,仍是把它強行中止之後,甚至是把它卸載之後,它的service都沒有被Android的系統幹掉,依然是巋然不動了。我就感到了納悶了,後來和羣裏的大牛討論後,才知道360手機衛士真他媽的流氓,它是靠第三方的應用,360手機衛士將其開啓。這就引出了,咱們今天的話題,說一說service的重啓方式,從而獲取到最高的權限了。android
1. 在service的OnDestroy中從新start service。app
正規的stopservice的退出後,都會調用OnDestroy方法了,咦,咱們何不在此方法後調用start service了,要想保證一個service被殺死後可以本身從新啓動(重生),只須要在onDestroy函數中加上一些代碼便可。以上面的例子來講明:函數
public void onDestroy(){ Log.i(TAG,"onDestroy"); ................. Intent localIntent = new Intent(); localIntent.setClass(this, MusicService.class); // 銷燬時從新啓動Service this.startService(localIntent); }
這種方法也不是很好了,當你把service伴隨的主進程停掉之後,它依然會把service幹掉。this
2.在manifest清單文件中配置使其service不死。spa
咱們從TRACE中能夠驗證,service執行了onCreate,onStart(沒有看到onDestroy的TRACE,應該是執行了的)。若是想讓服務不被殺死(也即無動做不改變),在XML的<application段後面加上 android:persistent="true"就好了。code
這種方法也不是 萬能的,有些手機他恰恰可以停掉該service。xml
3.利用第三方應用start service對象
這種方法能夠說是萬能的,可是要確保用戶可以安裝你依附第三方應用,並且是徹徹底底的流氓行爲。blog
4.經過Receiver起應用進程
註冊BroadcastReceiver兩種方式:方式一,靜態的在AndroidManifest.xml中用<receiver>標籤聲明註冊,並在標籤內用<intent- filter>標籤設置過濾器,如上的開機自啓動方式。方式二,動態地在代碼中先定義並設置好一個 IntentFilter對象,而後在須要註冊的地方調 Context.registerReceiver()方法,若是取消時就調用Context.unregisterReceiver()方法。若是用動態方式註冊的BroadcastReceiver的Context對象被銷燬時,BroadcastReceiver也就自動取消註冊了。
一相應的實例以下:
import android.content.BroadcastReceiver; import android.content.IntentFilter; IntentFilter ScreenFilter = new IntentFilter(); ScreenFilter.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(mScreenFilterReceiver, ScreenFilter); private BroadcastReceiver mScreenFilterReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { freshDetect(); //作要求的處理 } } };
這種方法重啓service,也能夠說是萬無一失的。
以上就是重啓service的四種方式,你們是否有收穫,請給予反饋.