1. 程式人生 > >避免後臺程序被殺死的幾種方法

避免後臺程序被殺死的幾種方法

Android的幾種程序

前臺程序

    即與使用者正在互動的Activity或者Activity用到的Service等,如果系統記憶體不足時前臺程序是最後被殺死的。

可見程序

    可以是處於暫停狀態(onPause)的Activity或者繫結在其上的Service,即被使用者可見,但由於失去了焦點而不能與使用者互動。

服務程序

    其中執行著使用startService方法啟動的Service,雖然不被使用者可見,但是卻是使用者關心的。例如使用者正在非音樂介面聽的音樂或者正在非下載頁面自己下載的檔案等。當系統要空間執行前兩者程序時才會被終止。

後臺程序

    其中執行著執行onStop方法而停止的程式,但是卻不是使用者當前關心的,例如後臺掛著的QQ,這樣的程序系統一旦沒了有記憶體就首先被殺死。

空程序

    不包含任何應用程式的程式元件的程序,這樣的程序系統是一般不會讓他存在的。

如何避免後臺程序被殺死?

1.呼叫startForegound,讓你的Service所在的執行緒成為前臺程序。

2.Service的onStartCommond返回START_STICKY或START_REDELIVER_INTENT。

3.Service的onDestroy裡面重新啟動自己。

再看一下其他方法。

    基本上大家都知道提高service優先順序可以在很大程度上讓你的service免於因為記憶體不足而被kill,當然系統只是在此時先把優先順序低的kill掉,如果記憶體還是不夠,也會把你的service幹掉的。

android:persistent="true"

    常駐記憶體屬性對第三方app無效,下面是官方說明

android:persistent

    Whether or not the application should remain running at all times — "true" if it should, and "false" if not. The default value is
 "false". Applications should not normally set this flag; persistence mode is intended only for certain system applic    if(intent.getAction().equals(Intent.ACTION_TIME_TICK))
    {
            
    if (!isServiceRunning(name)) 
    { 
        Intent mIntent = new Intent(context, MyService.class); 
        context.startService(mIntent); 
    } 
   }

startForeground將其放置前臺

Notification notification = new Notification();  
notification.flags = Notification.FLAG_ONGOING_EVENT;  
notification.flags |= Notification.FLAG_NO_CLEAR;  
notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;  
startForeground(1, notification); 

監聽系統廣播

     可以監聽Intent.ACTION_TIME_TIC系統時鐘廣播,系統每隔一段時間傳送這個廣播,當service被殺死的時候,隔一段時間通過廣播啟動。動態註冊android.intent.action.TIME_TICK監聽。

    判斷service是否啟動

	public boolean isServiceRunning(String serviceName)
	{
		ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
	    for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) 
	    { 
	    	if(serviceName.equals(service.service.getClassName()))
	    	{ 
	    		return true; 
	    	} 
	    }
	    return false;
	}

    接受到廣播後判斷是否啟動該service, 若沒有啟動就啟動它。

    if(intent.getAction().equals(Intent.ACTION_TIME_TICK))
    {
			
	if (!isServiceRunning(name)) 
	{ 
		Intent mIntent = new Intent(context, MyService.class); 
		context.startService(mIntent); 
	} 
   }