어플리케이션을 종료하는 방법이 몇가지 있더군요.
하지만 Activity 스택이 쌓인 상태에서 한 번에 종료하는 방법은 제가 찾지 못했습니다;
다른 분들은 어떻게 하신건지 모르겠지만 제가 한 방법을 소개하겠습니다~
강좌라기엔 무색하지만... 팁 이런 카테고리 있었음 좋겠네요 =_=;
(강좌를 소스로 바꿨습니다~ 영 부끄러워서;)
저는 finish()를 이용해서 종료하는 방법을 택했는데요.
조금은 귀찮은 방법이 될 수도 있습니다.
우선 액티비에 종속되는 액티비티를 제외하고 (가령 TabHost에 Tab으로 들어가는 액티비티)
액티비티에 onActivityResult()를 오버라이드(한글로 좋은 말 없을까요 =_=?) 합니다.
그리고 특정 result값이 넘어오면 같이 finish()를 실행하는 방법입니다.
갑, 을, 병, 정 액티비티가 있다고 하겠습니다.
앱을 실행하면 먼저 갑이 뜹니다.
그리고 startActivity에 의해
을, 병, 정 순으로 들어왔습니다.
여기서 취소(이전)버튼을 누르면 다시 정이 종료되면서 병으로 가고, 을로 가고, 갑으로 가고 이렇게 되겠죠.
하지만 이렇게 하려면 사용자가 취소(이전)버튼을 연타해야 하는 노고가 필요합니다 =_=;
해서, 저는 정 액티비티에서 메뉴버튼을 눌렀을 때 "앱 종료"라는 메뉴를 만들었고,
이를 누르면
setResult(4); //죽음의 4입니다 -0-;
finish();
를 하였습니다.
각 액티비티에는 다음의 소스가 들어가있습니다.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (resultCode) { case 3 : case 4 : setResult(resultCode); finish(); break; } }
result를 4로 설정하고 finish()를 했으니, 이전 액티비티에는 resultCode가 4로 전달이 되고, switch문에 의해
다시 finish()를 호출하게 됩니다.
이런 식으로 스택에 쌓인 액티비티들은 finish()를 호출하게 되고,
앱은 정상 종료됩니다.
이 외에 쌓여있는 액티비티를 원터치로 종료하는 방법 아시는 것 있으시면 같이 공유해요~
P.S. API상으로는 공식적으로 한 번에 앱을 죽이는 메서드를 제공하지 않고 있는데, 이유가 있는걸까요? 아니면 제가 못찾는건가요 =ㅁ=;
http://www.androidside.com/bbs/board.php?bo_table=420&wr_id=195
http://darkhorizon.tistory.com/entry/Systemexit
위에걸 보면.. System.exit(0)이 finish()보다 더 낫다고 되어 있네요...
근데...
http://androidside.com/bbs/board.php?bo_table=B49&wr_id=32107
여기엔 System.exit(0)을 쓰면 메모리 릭이 발생한다고 되어 있구요... 뭐가 맞는거지?
음... 그냥 둘다 사용하는게 좋지 않을까 싶네요~~
댓글 중에 좋다. 메모리릭난다.. 뭐 그런 글도 있는데
저의 다음과 같은 경험을 했습니다.
System.exit(0)을 하면 메모리에 깔끔하게 정리 되더라구요.
단 너무 깔끔해서 좀 문제가 있더라구요.
문제점
1. 상태바에 노티가 뜨고 이것을 클릭하면 내 앱이 실행이 안됨 (이런 식으로 기능을 구현하셨을 경우죠)
2. 홈화면에 바로가기 아이콘으로 앱 실행이 안됨..
아마도 다른 알람이나. 뭐 그런 동작도 좀 이상할 듯합니다.
이런류의 것을 사용하신 다면 꼭 동작 확인해 보시구 사용하시구요.
그렇지 않다면.. 깔끔하고 좋은 듯해요.
broadcast 쓰셔도 될겁니다.
하나가 종료될때 특정 broadcast를 날리는거죠.. 그걸 수신한 activity들은 다 스스로 finish하면 될거 같은데요.