엑티비티 A, B가 있습니다.
A가 최초 실행시 불리는 MainActivity라고 가정하고
A 엑티비티는 onCreate에서 이것저것 필요한 init을 해주고
작업이 완료되면 B라는 엑티비티로 넘겨줍니다....
이때 startActivityForResult로 B엑티비티를 실행하고
B엑티비티는 백버튼을 누르면 종료하시겠습니까? 묻는 팝업이 뜨고
확인버튼을 누르면 setResult(RESULT_OK):를 해주고 finish();를 호출하여
A 엑티비티도 함꼐 종료가 되며 정상 종료가 되도록 구현하였습니다.
그리고 B 이하의 모든 엑티비티는 무조건 B로 돌아와야만 종료하게끔 구현 되어있고,
강제종료를 해야할 경우엔 B 엑티비티를 CLEAR_TOP 플래그를 주어 실행한 뒤
B엑티비티의 onNewIntent()에서 setResult를 해주고 finish()를 호출하도록 하여 종료하였습니다...
A엑티비티와 B엑티비티는 둘 다 singleTop 속성을 주었구요....
정상 작동시엔 문제없이 돌아가는데... 이것이 킬앱과 조합되니... 문제를 일으키네요....
A 엑티비티가 킬앱이 될 떄 Destroy 되고 B 엑티비티에서 finish()로 종료될 때 A 엑티비티는 onCreate가 호출되며
가장 초반부에 설명한대로 여러가지 init 류를 실행 한 뒤 init이 완료되면 다시 B를 호출합니다....
그러니까 onActivityResult가 호출되기 전에 onCreate에서 앱 최초 실행시 진행하는 작업들을 진행하네요...
쉽게 말해 "종료불가" "무한 재실행"..........
그래서 protected void onSaveInstanceState(Bundle saveBundle) 를 이용하여 OS kill 이 일어났거나 kill 앱으로 죽었을 경우
boolean 값을 하나 저장하도록 하고 onCreate에서 그 값을 얻어와 bool 값이 true 일 경우 킬앱 되고 난 뒤의 onCreate라 판단하고
finish()하도록 구현하니 킬앱 작동 후에도 종료가 잘 되었습니다...
근데 하나의 문제가 또 생겼습니다.. ㅠ
킬앱 후에 푸시 메세지를 받아서 상단 노티바를 내려서 해당 메세지를 클릭하면
A엑티비티의 onNewIntent를 거쳐서 B엑티비티로 가고 B 엑티비티에서 푸시 type에 해당하는 엑티비티로 넘겨주게 되어있는데...
킬앱 또는 OS에 의해 죽어버린 A 엑티비티는 onNewIntent가 호출 되기전에 onCreate가 먼저 호출되어서
OKKill boolean 값이 true로 기록되어있어서 그냥 앱을 종료시켜 버리네요....
이거 뭔가 두서없이 썼는데....
위와같은 문제가 있는데 저의 앱 종료 방식이 잘 못된 건지 궁금합니다...
카카오톡으로 저에게 생긴 문제들을 하나하나 다 그대로 테스트 해보았는데 카톡은 잘 되더라구요 ㅠ_ㅠ 흑흑...
네 저도 그렇게 생각하여 최초 구현시 그렇게 구현하였는데
푸시를 받아서 notification을 등록할 때 pendingIntent에 A 엑티비티를 주고
A엑티비티의 onNewIntent에서 이를 처리하게끔 되어있는데...
A엑티비티를 B엑티비티를 부른 후 finish 시켜버리면..
푸시 메세지를 눌렀을 시 onCreate가 되면서 기존의 Activity 스택 위에 B엑티비티가 쌓입니다...
B에서 해당 푸시 관련 내용을 보여주는 엑티비티가 C라고 가정했을때
A (A finish())-> B -> 킬앱 -> 푸시 noti 클릭 -> A (A finish()) -> B -> C 이렇게 진행되었을때 스택에
B,B,C 이렇게 쌓여있습니다... 그래서 C에서 finish()를 하면 B가 튀어나오고 B에서 finish()를 하면 B 가 또 튀어나옵니다...
이문제때문에 A를 살려두고 했었거든요....
그러고보니 A에서 B를 호출할때 그냥 호출하는데 여기에 flag를 주면 B가 한 개만 유지되게끔 할 수 있나요...?
B액티비티 start할 때 플래그를 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
지정해서 해보시면 B액티비티가 중복으로 쌓이지 않을거에요.
모두 답변 감사합니다~
원조안드로이드 말씀 대로 굳이 A 엑티비티를 살려둘 필요가 없다고 생각하여 B호출 후 finish 시켜줬는데...
BCBD 순서로 호출시 B가 두번 쌓이는 문제가 있어서 A를 클리어탑, 뉴태스크, 싱글탑 플래그로 호출하는 식으로하여
B를 호출했는데...
그땐 BCBD 문제를 A를 살리는 방식으로만 해결을 했었는데 어제 다시 생각해보니 A를 곧장 finish 시켜주고
A에서 B를 부를때 뉴태스크, 싱글탑, 클리어탑 플래그를 주니 B가 OS 또는 킬앱에 의해 죽더라도 항상 B는 한개가 보장되며
A또한 B호출 후 finish 시키기 때문에 OS Kill 이나 킬앱 Kill과 무관하게 일관적인 동작을 하게 되었습니다.
시나리오 A->B->C->A->B->D
간략 시나리오 B->C->B->D (A는 B호출후 스스로 finish 하기때문에 제외)
엑티비티 스택 A-B-BC-BCA-B-BD : 최종 스택 BD
BCA 에서 B를 클리어탑, 뉴태스크, 싱글탑 속성을 주니 C가 사라지며 A는 B 호출후 finish 하니 원래 사라지는 것이고.... 해서
B만 남게 되고 그 위에 다른 엑티비티를 쌓을 수 있게 되네엽
답변해주신분들 감사하구요~ 또 다른분이 이 글이나 제 댓글이 도움이 되었으면 좋겠네요~ ^^
굳이 A 액티비티를 살려둘 필요가 있나요?
이미 init을 다 하고 B액티비티를 실행시키고 B에서 종료가 되는데
A를 종료하고 B로 넘어가면 되지 않나요?