티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
Clear the entire history stack and start a new activity on Android
안드로이드에서 전체 히스토리 스택을 지우고 새로운 액티비티를 시작하는 방법
문제 내용
Is it possible to start an activity on the stack, clearing the entire history before it?
스택 내 액티비티를 지우고, 그 위에 새로운 액티비티를 시작하는 것이 가능한가요?
The situation
상황
I have an activity stack that either goes A->B->C or B->C (screen A selects the users token, but many users only have a single token).
A->B->C 또는 B->C로 이루어진 액티비티 스택이 있습니다. (스크린 A는 사용자 토큰을 선택하며, 많은 사용자들은 하나의 토큰만을 가지고 있습니다.)
In screen C the user may take an action which makes screen B invalid, so the application wants to take them to screen A, regardless of whether it is already in the stack. Screen A should then be the only item on the stack in my application.
스크린 C에서는 사용자가 B 스크린을 무효화시키는 액션을 취할 수 있으며, 이 경우 애플리케이션은 스크린 A로 이동시키고자 합니다. 이미 스택 내에 있더라도요. 이후 애플리케이션 내에는 스크린 A만 남아 있어야 합니다.
Notes
참고 사항
There are many other similar questions, but I haven't found anything that answers this exact question. I tried calling getParent().finish()
- this always results in a null pointer exception. FLAG_ACTIVITY_CLEAR_TOP
only works if the activity is already on the stack.
많은 유사한 질문들이 있지만, 이 정확한 질문에 대한 답을 찾지 못했습니다. getParent().finish()를 호출해 봤으나, 항상 null pointer exception이 발생합니다. FLAG_ACTIVITY_CLEAR_TOP은 이미 스택에 있는 경우에만 작동합니다.
높은 점수를 받은 Solution
In API level 11 a new Intent Flag was added just for this: Intent.FLAG_ACTIVITY_CLEAR_TASK
API 레벨 11 이후에는 이를 위한 새로운 인텐트 플래그가 추가되었습니다: Intent.FLAG_ACTIVITY_CLEAR_TASK
Just to clarify, use this:
다음과 같이 사용하세요:
Java
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Kotlin
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
Unfortunately for API lvl <= 10, I haven't yet found a clean solution to this. The "DontHackAndroidLikeThis" solution is indeed pure hackery. You should not do that. :)
안타깝게도 API 레벨 10 이하에서는 깔끔한 솔루션이 아직 없습니다. "DontHackAndroidLikeThis" 솔루션은 정말로 해킹적인 방법입니다. 그렇기 때문에 그것을 하면 안 됩니다. :)
Edit: As per @Ben Pearson's comment, for API <=10 now one can use IntentCompat class for the same. One can use IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
flag to clear task. So you can support pre API level 11 as well.
수정: @Ben Pearson의 댓글에 따라, API <=10의 경우 IntentCompat 클래스를 사용할 수 있습니다. IntentCompat.FLAG_ACTIVITY_CLEAR_TASK 플래그를 사용하면 태스크를 지울 수 있습니다. 그러므로 API 레벨 11 이하도 지원할 수 있습니다.
가장 최근 달린 Solution
Advanced Reuseable Kotlin:
고급 재사용 가능한 코틀린:
You can set the flag directly using setter method. In Kotlin or
is the replacement for the Java bitwise or |
.
setter 메서드를 사용하여 플래그를 직접 설정할 수 있습니다. 코틀린에서는 or 비트 연산자 |의 대체 언어입니다.
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
If you plan to use this regularly, create an Intent extension function
이것을 자주 사용하려면, 인텐트 확장 함수를 만들어 보세요.
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
You can then directly call this function before starting the intent
그런 다음 인텐트를 시작하기 전에 이 함수를 직접 호출할 수 있습니다.
intent.clearStack()
If you need the option to add additional flags in other situations, add an optional param to the extension function.
다른 상황에서 추가 플래그를 추가해야 할 필요가 있는 경우에는, 확장 함수에 선택적 매개변수를 추가하세요.
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
출처 : https://stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android
'개발 > 안드로이드' 카테고리의 다른 글
Android Fragment 에서 뒤로 가기 버튼 처리하기 (0) | 2023.01.16 |
---|---|
Android에서 URI Builder 사용 또는 변수가 있는 URL 생성 (0) | 2023.01.15 |
Android에서 WebView와 loadData (0) | 2023.01.14 |
제목 없이 DialogFragment 만들기 (0) | 2023.01.14 |
슬라이드 업/다운 애니메이션으로 View 보이기 및 숨기기 (0) | 2023.01.13 |