본문 바로가기
Language/Android

[Android] 안드로이드_Task 강제종료 핸들링 (feat. 최근 실행된 앱)

by 썸머워즈 2019. 10. 13.
반응형



안드로이드 강제종료 핸들링 하기


( 출처 : 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() 에서 시작하는 편이 안정성 측면에서 좋다.


반응형


댓글

TOP