안드로이드

안드로이드 다른 어플리케이션 종료 시키기

IT꿈나무 2014. 10. 8. 16:53
반응형

옛날 방법


Froyo 로부터 deprecated 되었지만, 혹여나 Froyo 이전도 지원할 경우에 필요할 것 같아 정리했다.


메니페스트에 다음 퍼미션을 주고..


<uses-permission android:name="android.permission.RESTART_PACKAGES"/>


App 에서 다음 코드를 수행한다.


ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);

am.restartPackage( getPackageName() );




새로운 방법


메니페스트에 다음 퍼미션을 주고..


<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>


다음 코드로 process 를 죽여준다.


ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);

am.killBackgroundProcesses (getPackageName());





단, 이전의 restartPackage() 의 경우 모든 process 를 깔끔하게 죽여주었다면, killBackgroundProcess() 의 경우 프로세스의 상태에 따라 중요하지 않은 프로세스만을 선별적으로 종료시킨다. 

Process 중요도는 다음으로 구분된다.


IMPORTANT_EMPTY

IMPORTANT_BACKGROUND

IMPORTANT_SERVICE

IMPORTANT_VISIBLE

IMPORTANT_FOREGROUND


killBackgroundProcess 는 Service 이하의 중요도를 가진 process 들을 모두 종료시킨다. 여기에 service 도 포함되었다는 것을 주의깊게 봐야 한다. Service 는 재시작하기 때문. 그래서 Service process 가 제대로 사라지지 않을 수 있다. stopService() 를 호출한 후 killBackgroundProcess() 를 호출할 수도 있지만, stopService() 가 동기함수가 아니라 IPC 호출이 일어나는 non-blocking 함수이기 때문에 미묘한 타이밍 이슈를 일으킬 수도 있다고 한다.







System 함수들


System.exit() 나 Process.killProcess() 로 죽이는 방법도 있는데, 위의 방법들은 특정상황에서 다시 부활하곤 한다. 그 상황은 Service 의 onStartCommand() 함수의 return 값이 START_NOT_STICKY 가 아닌 경우.


두번째는 Activity 의 Stack 이 남아있는 경우. 이는 Process 가 activity stack 을 관리하는 것이 아니라 system 에서 관리하기 때문.

반응형