옛날 방법
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 에서 관리하기 때문.
'안드로이드' 카테고리의 다른 글
[안드로이드] 네비게이션 바 숨김 효과 만들기 (0) | 2021.04.07 |
---|---|
[안드로이드] 종료 작업관리자 에서도 안보이게 (0) | 2017.06.05 |
[안드로이드] 카메라 이벤트 받기 동적, 정적 BroadCastReceiver 받기 (0) | 2017.04.24 |
[안드로이드] Doze(잠자기) 모드 분석 (1) | 2017.04.21 |
[안드로이드] Broadcast 를 이용한 앱간 통신 (0) | 2017.04.19 |