2010년 12월 7일 화요일

[Android] 어플리케이션 Process 를 얼추 죽이는 새로운 방법

 

 

 

프로세스를 정상종료 하려고 구글링 하다가 발견한 방법..

기존의 프로세스 죽이는 방법은 2.1까지만 지원되다가

2.2 부터는 아직까지 정확하게 프로세스를 정상종료 시키는 방법이 없다고 합니다.

하지만 거의(얼추) 죽이는 방법이 있다고 해서 포스팅 해봅니다.

 

 

 

 

public void requestKillProcess(final Context context){
	
	//#1. first check api level.
	int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
	if (sdkVersion < 8){
		//#2. if we can use restartPackage method, just use it.
		ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		am.restartPackage(getPackageName());
	}else{
		//#3. else, we should use killBackgroundProcesses method.
		new Thread(new Runnable() {
			@Override
			public void run() {
				ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
				String name = getApplicationInfo().processName;
				RunningServiceInfo si;
				
				//pooling the current application process importance information.
				while(true){
					List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
					for(RunningAppProcessInfo i : list){
						if(i.processName.equals(name) == true){
							//#4. kill the process,
							//only if current application importance is less than IMPORTANCE_BACKGROUND
							if(i.importance >= RunningAppProcessInfo.IMPORTANCE_BACKGROUND)
								am.restartPackage(getPackageName());	//simple wrapper of killBackgrounProcess
							else
								Thread.yield();
							break;
						}
					}
				}
			}
		}, "Process Killer").start();
	}
}

 

안드로이드 프로요 2.2 아래 버젼 일경우 ..

1.메니페스트 파일에 RESTART_PACKAGES 권한을 사용한다고 선언한다.
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>

2.ActivityManager 의 restartPackage API 를 호출한다.
ActivityManager am
             = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.restartPackage(getPackageName());

이것도 말끔히 종료 되진 않지만 그래도 얼추 죽일 수 있다고 하네요..

 

 

 

 

안드로이드 프로요 2.2 윗 버젼 일경우 ..

 

SDK 버전과 관계없이 프로세스를 종료할 때 사용할 수 있는 requestKillProcess() 라는 메서드를 구현하였습니다. 프로요 이전 버전인 경우, 기존에 사용하던 방법이 그대로 별다른 생각없이 restartPackage() 메서드를 호출 하도록 구현되어 있습니다.


 프로요 이 후 버전인 경우가 조금 골치 아픈데, 어느 시점에 해당 어플리케이션 프로세스의 우선 순위가 변경될지 알아내는 방법을 잘 몰라서, 주기적으로 프로세스 상태 정보를 폴링하도록 구현되었습니다. 스레드를 하나 생성한 후, 프로세스의 상태를 반복 체크하다가, 프로세스 중요도가 IMPORTANCE_BACKGROUND 보다 낮아지는 순간, restartPackage() 를 호출 하도록 되어있습니다.

 어째, 구현 내용이 좀 꺼림직 하긴 합니다만, 어플리케이션 내에서 사용하는 어플리케이션 컴포넌트 (Service / Activity / BroadcastReceiver ) 관리에만 신경을 써 준다면 (시작한 Service 는 잊지 않고 정지 시켜주는 등), 기존 restartPackage() 와 같이 어플리케이션 어느 시점에 호출에도 얼추 비슷하게 동작하는 것은 확인 하였습니다. (스레드가 계속 도니까;;;;)

 

 

 

[출처] - http://huewu.blog.me/110089551997

댓글 없음:

댓글 쓰기