バックグラウンドプロセスが殺されるのを避けるいくつかの方法

2726 ワード

Androidのいくつかのプロセス
フロントプロセス
すなわち,ユーザと対話中のActivityやActivityが使用するサービスなどは,システムメモリが不足するとフロントプロセスが最後に殺される.
可視プロセス
一時停止状態(onPause)のActivityまたはそれにバインドされたService、すなわちユーザに表示されるが、フォーカスが失われたためユーザと対話できない.
サービスプロセス
startServiceメソッドを使用して起動するサービスが実行されており、ユーザーには表示されませんが、ユーザーが関心を持っています.例えば、ユーザが非音楽インタフェースで聴いている音楽や、非ダウンロードページで自分でダウンロードしているファイルなどである.システムが空間的に実行する前に両方のプロセスが終了します.
バックグラウンドプロセス
その中でonStopメソッドを実行して停止するプログラムが実行されていますが、ユーザーが現在関心を持っているわけではありません.例えば、バックグラウンドに掛けられているQQのようなプロセスシステムは、メモリがないとまず殺されます.
空のプロセス
アプリケーションのプログラムコンポーネントを含まないプロセスです.このようなプロセスシステムは一般的には存在しません.
バックグラウンドプロセスが殺されるのを避けるにはどうすればいいですか?
1.startForegoundを呼び出し、サービスが存在するスレッドをフロントプロセスにします.
2.サービスのonStartCommondはSTARTに戻るSTICKYまたはSTART_REDELIVER_INTENT.
3.ServiceのonDestroyで自分を再起動します.
他の方法をもう一度見てください.
基本的にサービスの優先度を高めることで、メモリ不足でkillされることを避けることができることはよく知られています.もちろん、システムはこの時に優先度の低いkillを落とすだけで、メモリが足りなければ、サービスを乾かすことができます.
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システムクロック放送、システムは一定時間ごとにこの放送を送信し、サービスが殺されたとき、一定時間おきに放送を通じて起動する.動的登録android.intent.action.TIME_TICK傍受.
サービスが起動しているかどうかを判断する
	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;
	}

ブロードキャストを受信してサービスを起動するかどうかを判断し、起動しなければ起動します.
    if(intent.getAction().equals(Intent.ACTION_TIME_TICK))
    {
			
	if (!isServiceRunning(name)) 
	{ 
		Intent mIntent = new Intent(context, MyService.class); 
		context.startService(mIntent); 
	} 
   }