본문 바로가기
안드로이드/개발자 일상

안드로이드 앱 강제 종료 시점 알기 (생명 주기 onDestroy 호출 안됨)

by 차누감 2020. 4. 9.

2020/04/08 - [안드로이드/개발자 일상] - 안드로이드 생명주기 (LifeCycle)

위 링크에서 했던 생명주기 테스트 앱으로 실행해 보았습니다. 

우리가 알고 있는 생명 주기는

onCreate - > onStart -> onResume -> onPause -> onStop -> onDestroy

 

뒤로가기 또는 finish()로는 onDestroy가 호출되지만... 아래 상황에서는 onDestroy가 호출이 안된다!!

문제의 경우..

 

휴대폰에 위 화면과 같이 앱을 강제 종료 시킬 수 있습니다.

하지만 앱 개발자 입장에서는 생명주기가 실행되지 않으니, 이 시점을 알고 싶을때가 있습니다. 

 

이때 Service를 이용하여 Task가 종료 되었을때로 알 수 있습니다.

( 다른 방법을 알고 계시면 댓글로 알려주세요~!! )

 

우선 Service를 상속받은 Class를 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ForecdTerminationService extends Service {
 
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
 
    @Override
    public void onTaskRemoved(Intent rootIntent) { //핸들링 하는 부분
        Log.e("Error","onTaskRemoved - 강제 종료 " + rootIntent);
Toast.makeText(this, "onTaskRemoved ", Toast.LENGTH_SHORT).show();
        stopSelf(); //서비스 종료
    }
}
 

그리고 Service를 Manifest에 등록합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
</application
 
 
 
<service android:name=".util.ForecdTerminationService"
    android:stopWithTask="false" />
 
 
</application>
 

해당 앱의 제일 초기 액티비티에서 실행해줍니다. 

1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        startService(new Intent(this, ForecdTerminationService.class));
 
    }
}
 

 

이제 앱을 실행하여 강제 종료 시에도 알 수 있습니다.

<실행 화면> 

onDestroy도 호출되고 service의 onTaskRemoved도 호출되는 것을 볼 수 있습니다.

아래 실행 화면은 여러개의 Activity가 있을 경우, 강제 종료시킨다면

Task에 존재하는 Activityd의onDestroy가 다 실행됩니다.  

( MainAcitivity와 SecondActivity의 onDestroy가 둘다 호출됩니다. )

 

댓글