안드로이드 : 백 스택 지우기


330

안드로이드에는 몇 가지 활동이 있습니다 .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가 여전히 나타납니다. 어떻게 피할 수 있습니까?

답변:


438

FLAG_ACTIVITY_NEW_TASK에 대한 문서에 설명 된대로 추가해보십시오 FLAG_ACTIVITY_CLEAR_TOP.

이 시작 모드는 FLAG_ACTIVITY_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.

28
고맙지 만 나는 이것을 시도했다. 여전히 C가 표시된 후 뒤로 버튼을 탭해도 여전히. 무엇을 놓칠 수 있습니까?
Martin

4
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
dzeikei 2016 년

8
내가 그러나 소스 활동 마무리 ()를 호출 작동하지 않는 것은 내가 달성하는 데 필요한 것을 수행
2cupsOfTech

10
이것이 작동하지 않는 것과 동일한 문제가있었습니다. 나를 위해
Arno

20
또한 하나 더 명확한 Intent intent = new Intent (SingUpActivity.this, LoginActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (의도); 끝();
Sam

147
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

8
CLEAR_TOP플래그 와 관련하여 -이 조합은 전체 스택을 완전히 지우고 새로운 활동을 앱에서 유일하게 만든 유일한 조합입니다. 감사합니다!
Aviel Gross

8
이 답변과 허용되는 답변의 차이점은 무엇입니까?
Yuri Heupa

7
감사합니다, 허용 대답과의 차이는이 플래그와 함께 우리가 전화 activity.finish에 필요성을 해달라고입니다
파블로 Cegarra

1
FLAG_ACTIVITY_CLEAR_TASK는 NEW_TASK와 함께 완벽하게 작동
샴술 Arefin Sajib에게

1
이것은 정답입니다. 대단히 감사합니다.
MD 덴마크어 안사리

77

관련 활동에 대한 매니페스트 파일 추가는 어떻습니까?

android:noHistory="true"

B와 C의 활동 정의에? 백 스택에 추가되지 않습니다. 그것이 당신이 원하는 것인지 확실하지 않습니다.


3
FB 또는 이와 유사한 기능으로 로그인을 사용하는 경우
Skynet

2
@ 스카이 넷 왜? 이 작업과 관련된 문제는 무엇입니까?
Alfie Woodland

8
nohistory가 true 인 페이지에서 로그인하기 위해 FB에 제어를 전달하면 FB 앱은 이제 사용자를 로그인 한 후 착륙 할 위치를 찾지 못합니다.
Skynet

이렇게하면 액티비티가 백 스택에 추가되지 않습니다. ... 올바른 해결책이 아닙니다.
Tarun

정확히 찾고
있어요

63

이것은 오랫동안 나를 귀찮게합니다. 마침내 나는 이것을함으로써 그것을 해결했습니다.

조각으로 다음을 사용하십시오.

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

Activity에서 use ( Intent.FLAG_ACTIVITY_CLEAR_TASKfragment에 비해 intent flag를 하나 더 추가하십시오 ) :

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);

1
Intent.FLAG_ACTIVITY_CLEAR_TASK : 당신이 androidannotations를 사용하는 경우, 당신은 추가해야
yosafatade

활동 solutioin은 나를 위해 잘 작동했습니다. API 16으로 Daniel Schuler의 솔루션이 더 쉽다고 생각합니다.
PhilippS

yosafatade 감사합니다.
Marty Miller

30
  1. android:launchMode="singleTop"활동 A에 대한 매니페스트의 활동 요소에 추가
  2. 그런 다음 사용 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)활동를 시작할 때

이것은 활동 A가 시작될 때 그 위에있는 모든 작업이 지워져 A가 최상위임을 의미합니다. 루트에 A를 사용하여 새로운 백 스택이 만들어지고를 사용 singleTop하면 A를 한 번만 시작할 수 있습니다 (A는 이제로 인해 최상위에 있기 때문에 ..._CLEAR_TOP).


3
예. 이것이 내가 지금 사용하고 있지만 그렇게하지 않습니다. 뒤로 버튼을 누르면 여전히 C가 나타납니다.
Martin

홀수, 나는 그것을 프로젝트에서 사용했고 잘 작동합니다 ... 뒤로 누르면 홈 화면으로 이동합니다. 아마도 다른 일이있을 것입니다. 매니페스트를 게시 할 수 있습니까?
Joseph Earl

에뮬레이터를 다시 시작했는데 지금 말한 것처럼 작동하는 것 같습니다. 도와 주셔서 정말로 고맙습니다!
Martin

singleTop은 스택을 지우는 것과 아무 관련이 없어야합니다.
stdout

29

API 16 (Jelly Bean)부터 시작하면을 호출 할 수 있습니다 finishAffinity().

이제 ActivityCompat.finishAffinity(Activity activity)호환성 라이브러리를 사용하여 호출 할 수도 있습니다.

매니페스트의 taskAffinity를 해당 활동 그룹에 고유 한 패키지 이름으로 설정해야합니다.

자세한 내용은
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29를 참조하십시오.


API 16을 이미 사용하고 있다면 정말 사용자 친화적이고 쉬운 솔루션입니다.
PhilippS

3
알림 : 이것은 같은 작업을 공유하는 활동에만 적용됩니다. 이름
Ryan

이것은 역사에 단 하나의 활동이있는 경우에만 작동합니다.
arsent

17

사용해보십시오

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

그리고 아닙니다

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

11

응용 프로그램에 최소 SDK 버전 16이있는 경우 finishAffinity ()를 사용할 수 있습니다

현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오.

상단 결제 화면에서 모든 백 스택 액티비티를 제거합니다.

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29



8

향후 연구를 위해이 코드를 사용해보십시오.

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();

이 깃발은 마침내 나를 위해 일했습니다. 내가 한 것은이 플래그와 부울 여분의 EXIT = true와 같은 활동을 시작한 것입니다. inCreate ()에서 EXIT의 시작 매개 변수를 확인하고 true로 설정된 경우 finish ()를 호출했습니다. 자신의 앱을 닫는 것만으로도 많은 번거 로움이 있습니다.
Janne Oksanen

8

finishAffinity ()를 사용하십시오. 작업 A를 시작할 때 작업 C에서 백 스택 활동을 지 웁니다.


이 대답 만 나를 위해 작동합니다. Intent.FLAG_ACTIVITY_CLEAR_TOP 및 Intent.FLAG_ACTIVITY_NEW_TASK는 필요하지 않습니다
nuttynibbles

7

이 코드를 사용하여 새 활동을 시작하고 다른 모든 활동 스택 또는 백 스택을 닫거나 제거하십시오.

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

5
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.

5

도움이 될만한 흥미로운 해결책을 찾았습니다. 나는 내 onBackPressed()방법으로 이것을했다 .

finishAffinity();
finish();

FinishAffinity기존 활동과 스택의 연결을 제거합니다. 그런 다음 완료는 해당 활동을 종료하는 데 도움이됩니다. 결국 응용 프로그램을 종료합니다.


4

원래 질문의 코드가 나에게 잘 작동하는 것 같아서 여기에 대한 답변이 약간 오도 된 것으로 나타났습니다.

A가 루트 활동 인 경우 FLAG_ACTIVITY_CLEAR_TOP을 사용하여 B 또는 C에서만 시작하면 백 스택에서 B와 C가 제거됩니다.


4

kotlin에서는 java와 거의 동일합니다. 만 | 기호는 또는 텍스트 로 대체됩니다 . 따라서 다음과 같이 작성됩니다.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

3

나는 모든 솔루션을 시도했지만 아무도 나를 위해 개별적으로 일하지 않았습니다. 내 해결책은 :

선언 Activity A으로 SingleTop사용하여[android:launchMode="singleTop"] 안드로이드 매니페스트에.

이제 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();

2

Intent.FLAG_ACTIVITY_CLEAR_TOP이 경우에는 작동하지 않습니다. 사용하십시오(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

자세한 내용은 설명서 를 확인하십시오 .


2

당신이 시작하는 데 필요한 것처럼 나에게 소리 Activity C에서 Activity B사용하여 startActivityForResult(). 당신이 버튼을 클릭하면 Activity C전화를, setResult(RESULT_OK)그리고 finish()너무 Activity C종료됩니다. 에서은 Activity B, 당신은 할 수 onActivityResult()도 호출하여 응답 finish()자체를, 당신은 다시로 이동 것입니다 Activity A.


7
예, 그러나 A와 C 사이에 42 개의 활동이 있다면 다소 지루할 것입니다. FLAG_ACTIVITY_CLEAR_TOP 플래그는 OP가 원하는 것을 직접 수행해야합니다.
기 illa 브루 네리

이것은 OP가 원하는 것을 달성하는 최적의 방법이 아니며 @Guillaume이 말했듯이 루트와 스택 맨 위의 모든 활동에 코드가 필요합니다.
Jake Basile

정식 주목. 이것들은 내가 분명히 알아야 할 플래그입니다.
Maximus

1

logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);


1

당신은 당신의 전화를이 예제를 사용할 수 있습니다 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);


1

나를 추가 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();

1

재사용 가능한 고급 Kotlin :

setter 메소드를 사용하여 플래그를 직접 설정할 수 있습니다. 코 틀린에 or는 IS 교체 자바 비트 또는에 대한 |.

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

이것을 두 번 이상 사용하는 경우 의도 확장 기능을 작성하십시오.

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
}

0

에 추가하여 다음을 추가 FLAG_ACTIVITY_CLEAR_TOP할 수도 Intent.FLAG_ACTIVITY_SINGLE_TOP있습니다.

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


스택의 루트가 아닌 스택 맨 위의 활동에만 영향을 미칩니다.
Jake Basile

0

주어진 코드가 올바르게 작동합니다. Application Life Cycle 샘플에서 시도했습니다.

FLAG_ACTIVITY_CLEAR_TOP 플래그로 활동 A를 시작한 후 백 스택에 B와 C가 없습니다.


0

나는 activity_name.this.finish()새로운 의도를 시작한 후에 전화 했고 그것은 나를 위해 일했다.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

그러나 그것은 나를 위해 작동하지 않습니다 ... 나는이 솔루션을 사용하도록 제안하고 있지 않지만 깃발을 설정해도 효과가 없다면 당신은 이것을 시도 할 수 있습니다.


0

의도에 NO History Flag를 추가하십시오.

활동 B에서 다음과 같이 활동 C를 시작하십시오. >>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

0

매니페스트

android:launchMode="singleTask"

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

0

이것에 추가 Activity B하고Activity C

android:noHistory="true"

또는으로 Override onBackPressed다시 누르지 않도록하는 기능 return.

@Override
public void onBackPressed() {
   return;
}

0

분명 뒷면에 사용 SETFLAGS () 메소드는 모든 활동 가까이 열고 시작 yourActvity을

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.