Skip to content

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());