Android:ProcesserKiller
안드로이드에서 특정 프로그램을 죽이는 방법에 대하여 정리한다.
Example
package ---;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.os.Build;
/**
* 특정 프로세스를 종료시키는 유틸리티 클래스.
*
* @author cwlee
* @since 2013-08-15
*/
public class ProcessKiller {
/** 특정 패키지를 제거하는 Thread Runner class. */
private class KillRunner implements Runnable {
private final ActivityManager kActivityMgr;
private final List<RunningAppProcessInfo> kProcessList;
private final String kPackageName;
public KillRunner(Activity a) {
kActivityMgr = (ActivityManager) a.getSystemService(Context.ACTIVITY_SERVICE);
kProcessList = kActivityMgr.getRunningAppProcesses();
// 동일한 패키지 명칭 획득 API.
// _app_package_name = a.getApplicationInfo().packageName;
kPackageName = a.getPackageName();
}
@Deprecated
@Override
public void run() {
// 현재 어플리케이션을 특정하기 위해
// 전체 프로세스 목록에서 현재 어플리케이션을 찾는다.
for (RunningAppProcessInfo cursor : kProcessList) {
if (cursor.processName.equals(kPackageName) == true) {
if (cursor.importance >= RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
kActivityMgr.restartPackage(kPackageName);
// _activity_mgr.killBackgroundProcesses(_package_name);
} else {
Thread.yield();
}
break;
}
}
}
}
/** 생성자를 지원하지 않는다. */
protected ProcessKiller() {
throw new UnsupportedOperationException();
}
/**
* 자기 자신을 종료시킨다.<br>
*
* <h1>Remarks.</h1><br>
* 프로요(FROTO)버전 이전까지는 {@link android.os.Process.killProcess}을 사용하여 종료가 가능하다.<br>
* 하지만 그 이후 버전은 별도의 Thread를 사용하여 종료해야 한다.
*
* @param a
* 종료할 Activity.
*/
@Deprecated
public void killSelf(Activity a) {
if (a.isFinishing() == true) {
// Thread를 사용한 프로그램 제거시 최소 SDK 버전 정보.
final int kDestoryThreadMinSdkVersion = Build.VERSION_CODES.FROYO;
final int kCurrentSdkVersion = Build.VERSION.SDK_INT;
if (kCurrentSdkVersion < kDestoryThreadMinSdkVersion) {
final ActivityManager kActivityMgr = (ActivityManager) a.getSystemService(Context.ACTIVITY_SERVICE);
final String kPackageName = a.getPackageName();
if (kActivityMgr != null) {
kActivityMgr.restartPackage(kPackageName);
} else {
android.os.Process.killProcess(android.os.Process.myPid());
}
} else {
// Thread를 사용하여 종료한다.
final Thread kThreadExit = new Thread(new KillRunner(a), "Process Killer");
if (kThreadExit != null) {
kThreadExit.start();
}
}
}
}
}
Process Kill - Activity
// #01:
finsish();
// #02:
System.exit(0);
// #03:
android.os.Process.killProcess(android.os.Process.myPid());
// #04:
ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
// #05:
ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
am.killBackgroundProcesses(getPackageName());