Android:백스택 지우기
Android에서는 A, B, C와 같은 몇 가지 활동이 있습니다.
A에서 나는 B를 열기 위해 이 코드를 사용합니다.
Intent intent = new Intent(this, B.class);
startActivity(intent);
B에서 나는 C를 열기 위해 이 코드를 사용합니다.
Intent intent = new Intent(this, C.class);
startActivity(intent);
사용자가 C에서 버튼을 누르면 A로 돌아가서 백스택을 지우고 싶습니다(B와 C를 모두 닫습니다).그래서 사용자가 뒤로 버튼 B와 C를 사용하면 나타나지 않을 때, 저는 다음을 시도해 왔습니다.
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
하지만 제가 A 활동에 복귀했을 때 뒤로 버튼을 사용해도 B와 C는 여전히 나타납니다.어떻게 하면 피할 수 있을까요?
다음에 대한 문서에 설명된 대로 추가해 보십시오.
이 시작 모드는 FLAG_ACTIVE_NEW_TASK와 함께 사용하여 작업의 루트 활동을 시작할 경우 현재 실행 중인 해당 작업의 인스턴스를 포그라운드로 가져온 다음 루트 상태로 지웁니다.이 기능은 예를 들어 알림 관리자에서 활동을 시작할 때 특히 유용합니다.
그래서 당신의 코드는 시작할 것입니다.A
다음과 같습니다.
Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context
// view.getContext().finish() for fragments etc.
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
관련 활동을 위해 매니페스트 파일에 추가하는 것은 어떻습니까?
android:noHistory="true"
B와 C의 활동 정의에?백스택에 추가되지 않습니다.그것이 당신이 원하는 것인지 확실하지 않습니다.
이것은 저를 오랫동안 괴롭힙니다.결국 저는 다음과 같은 방법으로 해결했습니다.
조각에서 다음을 사용합니다.
Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
플래그를 더합니다.)를합니다.Intent.FLAG_ACTIVITY_CLEAR_TASK
조각과 비교):
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
16 Bean)부터는 API 16(Jelly Bean)을 .부터는 그냥 전화하시면 됩니다.finishAffinity()
.
이제 당신은 또한 전화할 수 있습니다.ActivityCompat.finishAffinity(Activity activity)
호환성 라이브러리를 사용합니다.
매니페스트의 taskAffinity를 해당 활동 그룹에 고유한 패키지 이름으로 설정해야 합니다.
- 더하다
android:launchMode="singleTop"
A에에 대해 합니다. - 사용할 경우
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
그리고.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
활동을는 A 활동을 시작합니다.
, A top.", "A"라는 의미입니다. 루에가 A는있새백생이스를 사용하여 새로운 됩니다.singleTop
한 할 수 가 A로 현재 에 있기 에)...._CLEAR_TOP
).
사용해 보십시오.
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
그리고 아닌
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
응용 프로그램에 최소 sdk 버전 16이 있는 경우 finishAffinity()를 사용할 수 있습니다.
현재 작업에서 선호도가 동일한 모든 활동과 이 활동 바로 아래의 모든 활동을 마칩니다.
이것은 나를 위한 작업이다 In Top Payment 화면에서 모든 백스택 활동을 제거합니다.
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
Use finishAffinity() to clear all backstack with existing one.
Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C,
- Activity B will be finished / removing from stack.
- Activity A will be finished / removing from stack.
- Activity C will finished / removing from stack.
더하다android:noHistory="true"
의 의자에 됩니다.<activity>
에 시대에AndroidManifest.xml
다음과 같이:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
향후 연구를 위해 이 코드를 사용해 보십시오.
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
태스크 A를 시작할 때 태스크 C에서 finishAffinity()를 사용하여 백스택 작업을 지웁니다.
이 코드를 사용하여 새 활동을 시작하고 다른 모든 활동 스택 또는 백스택을 닫거나 삭제합니다.
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
저는 도움이 될 만한 흥미로운 해결책을 찾았습니다.나는 내 안에서 이것을 했습니다.onBackPressed()
방법.
finishAffinity();
finish();
FinishAffinity
스택에 대한 기존 활동의 연결을 제거합니다.그리고 나서 마무리는 여러분이 그 활동을 끝낼 수 있도록 도와줍니다.그러면 응용 프로그램이 종료됩니다.
코틀린에서는 자바와 거의 비슷합니다.| 기호만 또는 텍스트로 대체됩니다.그래서, 다음과 같이 쓰여 있습니다.
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
재사용 가능한 고급 Kotlin:
세터 방법을 사용하여 플래그를 직접 설정할 수 있습니다.or
는 자바 비트위스를 대체하는 것입니까?|
.
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
이 기능을 두 번 이상 사용할 경우 Intent 확장 기능을 만듭니다.
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
그런 다음 의도를 시작하기 전에 이 함수를 직접 호출할 수 있습니다.
intent.clearStack()
다른 상황에서 플래그를 추가하는 옵션이 필요한 경우 확장 기능에 선택적 매개 변수를 추가합니다.
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
원래 질문의 코드가 잘 작동하는 것 같아서 여기 답변이 약간 오해의 소지가 있습니다.
A가 루트 활동인 경우 B 또는 C에서 FLAG_ACTIVE_CLEAR_TOP으로만 시작하면 B 및 C가 백스택에서 제거됩니다.
당신이 시작해야 할 것처럼 들립니다.Activity C
Activity B
을 이용하여startActivityForResult()
에서 Activity C
, 전화 걸기setResult(RESULT_OK)
그리고.finish()
그렇게Activity C
종료되었습니다.Activity B
당신은 그것을 가질 수 있습니다.onActivityResult()
또한 전화를 걸어 응답합니다.finish()
그 자체로, 그리고 당신은 다시 끌려갈 것입니다.Activity A
.
저는 모든 해결책을 시도했지만 저를 위해 개별적으로 작동하는 솔루션은 없었습니다.나의 해결책은
를 선언합니다.Activity A
~하듯이SingleTop
을 이용하여[android:launchMode="singleTop"]
Android 매니페스트에서.
이제시는동다추플가래그음안하를 합니다.A
합니다.그러면 스택이 지워집니다.
Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();
Intent.FLAG_ACTIVITY_CLEAR_TOP
이 경우에는 작동하지 않습니다.이해주요를 사용해 .(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
자세한 내용은 이 설명서를 참조하십시오.
코틀린의 예:
val intent = Intent(this@LoginActivity, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
finish()
logout.addFlags(의도).FLAG_ACTIVE_CLEAR_TASK); logout.addFlags(의도).플래그_활동_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
덧붙여서Intent.FLAG_ACTIVITY_CLEAR_TASK
문제를 해결했습니다.
Intent i = new Intent(SettingsActivity.this, StartPage.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
이 예를 사용하여 다음을 호출할 수 있습니다.Activity A
부터Activity C
Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);
그 후에는 뒤로 버튼을 누르는 활동이 표시되지 않습니다.
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finishAffinity();
finish();
에 더하여FLAG_ACTIVITY_CLEAR_TOP
추가해 보십시오.Intent.FLAG_ACTIVITY_SINGLE_TOP
또한:
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
지정된 코드가 올바르게 작동합니다.애플리케이션 수명 주기 샘플을 사용해 보았습니다.
FLAG_ACTIVE_CLEAR_TOP 플래그로 활동 A를 시작한 후 B와 C가 백스택에 없습니다.
전화해봤어요.activity_name.this.finish()
새로운 의도를 시작한 후에 그것은 나에게 효과가 있었습니다.
I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
하지만 저한테는 안 될 거예요이 솔루션을 사용하기 위해 제안하는 것은 아니지만 플래그를 설정하는 것이 당신에게 효과가 없다면 당신은 이것을 시도할 수 있습니다.그래도 사용하지 않는 것이 좋습니다.
의도에 기록 플래그를 추가하지 않습니다.
활동 B에서 아래와 같이 활동 C를 시작합니다. >>>>>
Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
언급URL : https://stackoverflow.com/questions/5794506/android-clear-the-back-stack
'programing' 카테고리의 다른 글
Postgres와 MariaDb 사이의 다른 동작을 최적으로 잠그는 최대 절전 모드 (0) | 2023.08.28 |
---|---|
Firefox의 선택 요소에서 화살표를 제거하는 방법 (0) | 2023.08.28 |
SQL 결과에 mariaDB 테이블의 한글 필드가 표시되지 않음 (0) | 2023.08.28 |
Node.js 장치 테스트 (0) | 2023.08.28 |
부트스트랩이 있는 고정 너비 버튼 (0) | 2023.08.28 |