안드로이드 강제종료 핸들링 하기
( 출처 : http://dktfrmaster.blogspot.com/2016/12/task.html )
개발 도중 최근 실행된 앱(스와이프 화면) 에서 앱 강제 종료 시 핸들링을 해야하는 상황이 생겨
실제로 적용한 사례를 기록해두고자 한다.(아주 큰 도움을 받은 블로그를 참고로 작성한다.)
프로세스를 강제종료 시키는 시점은 알 수 없지만, Task가 종료되는 시점은 감지할 수 있다 한다.
주의할 점은 프로세스가 종료되는 것과는 다르기 때문에 혼동하여 사용하면 부작용을 초래할 수 있다는 점이다.
Service 클래스에는 Task가 종료되었을 때 콜백을 받는 onTaskRemoved() 라는 메서드가 존재하는데 이 메서드를 이용해 Task의 종료시점을 잡을 수 있다.
1. 핸들링 하기 위한 클래스 선언하기
/**
* 앱 강제종료 핸들링
*/
public class UnCatchTaskService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onTaskRemoved(Intent rootIntent) { //핸들링 하는 부분
Log.e("Error","onTaskRemoved - " + rootIntent);
// 핸들링 해 적용할 내용
stopSelf(); //서비스도 같이 종료
}
}
Service를 상속받아 메서드를 사용한다.
super.onTaskRemove()를 호출하게 되면 Task가 종료되는 시점에 프로세스만 재시작되어 살아있는 형태가 되는데 핸들링 하고나서 해당 서비스 역시 종료 시켜주어야 하기 때문에 stopSelf() 를 사용하여 자체 종료시킨다.
2. AndroidManifest.xml 에 등록하기
</application
... >
...
<service android:name=".util.UnCatchTaskService"
android:stopWithTask="false" />...
</application>
Manifest에 서비스를 등록하고 이 때, android:stopWithTask 속성을 반드시 false로 설정해야 한다. true로 설정할 경우 onTaskRemoved() 메서드가 호출되지 않는다.
(android:name 은 해당 서비스 파일 경로이기 때문에 상위폴더가 없으면 그냥 " .클래스명 " 이다.)
3. 서비스 호출하기
/**
* 앱 초기화면 Activity
*/
public class SplashActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startService(new Intent(this, UnCatchTaskService.class));
...
}
}
해당 Service를 앱의 시작점에서 호출한다.
보통 앱의 시작점은 Application의 onCreat() 나 SplashActivity의 onCreate() 일 것이다.
그래도 가급적이면 SplashActivity의 onCreate() 에서 시작하는 편이 안정성 측면에서 좋다.
댓글