안드로이드 개발 질문/답변
(글 수 45,052)
public void requestKillProcess(final Context context) {
int sdkVersion = Integer.parseInt(Build.VERSION.SDK); if (sdkVersion < 8) {
ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); am.restartPackage(getPackageName()); } else {
new Thread(new Runnable() { @Override public void run() { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); String name = getApplicationInfo().processName;
while (true) { List<RunningAppProcessInfo> list = am .getRunningAppProcesses(); for (RunningAppProcessInfo i : list) { if (i.processName.equals(name) == true) {
if (i.importance >= RunningAppProcessInfo.IMPORTANCE_BACKGROUND) am.restartPackage(getPackageName()); Thread.yield(); break; } } } } }, "Process Killer").start(); } }
예 이 소스입니다...
불러 와서 사용 해 보려고 하지만....
2.1까지는 되는데 2.2는 도저히 안되네요....
사용 하는 법 알려 주실분을 찾아요 ;ㅁ; (1주일째 어플 종료랑 씨름 하고 있습니다 ;ㅁ;)
2010.07.29 16:53:29
에...그러니까 2.2 부터는 restartPackage() 메서드를 호출하면 그냥 killBackgroundProcess() 메서드가 호출된다고 생각하시면 되구요..
문서에 나와있듯이 이놈이 아무 조건없이 어플리케이션을 종료시키지는 않습니다. Activity 가 여러개 존재한다면, 모든 Activity 가 정상적으로 Finish 된 상황에서만;;; 해당 패키지의 프로세스가 종료되게 되겠지요;;;; 그럼 뭔 쓸모냐... 하실 수 있겠는데, Activity 가 모두 종료된 후에도 프로세스가 살아있으면 어플에서 사용하던 일반 스레드나 Static 변수등은 그대로 남아있게되니까, 그런 것들을 깔끔하게 정리할 때;;; 사용하시면 됩니다.
2010.07.29 18:01:57
네 그냥 아무 Activity 상에서 든
requestKillProcess(getApplication());
이렇게 호출해 주시면 됩니다.
1,2,3 엑티를 순서대로 실행 후에 3번 엑티에서 바로 어플을 종료하는 방법은 잘 모르겠네요;;; (한번 해보긴 해야할 듯)
그나마 비슷한 방식이라면;;;;
1번 엑티에다가 약간 장난을 쳐두신 후에,
3번 엑티에서 어플을 종료하고자 할 때, 바로 1번 엑티를 호출하시는 방법을 사용하실 수 있습니다.
이때, 인텐트 플래그를 FLAG_ACTIVITY_CLEAR_TOP 으로 주시고 임의의 Extra 값
(예를 들어 'KILL_APP' 이라던가...)을 설정하신 후에, startActivity 를 호출하면
2번 3번 엑티가 모두 종료되고 1번 엑티가 다시 실행되는데,
1번 엑티의 onNewIntent() 메서드를 오버라이드 하셔서, 특정 Extra 값이 존재하는 경우에는 바로 finish() 메서드를 호출하고,
해당 시점에 requestKillProcess() 메서드를 호출하시면;;;; (기네요....)
원하는 방식으로 구현이 가능합니다...
ACTIVITY_FLAG 에 관한 내용은
http://huewu.blog.me/110087045138 를 참고해 주세요;
This method is deprecated.
This is now just a wrapper for
killBackgroundProcesses(String)
; the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.걍 System.exit(int)나 Process.killProcess(int) 쓰셔도 프로세스는 죽습니다. 하지만 특별한 상황이 아니면 가급적 프로세스 죽이는 일은 안하는게 좋지 않을까 하는 생각입니다. 프레임웍 개발자들도 그렇게 얘기하구요.