Intent.FLAG_ACTIVITY_CLEAR_TOP를 사용하여 활동 스택을 지우는 방법은 무엇입니까?


84

나는 이것을 사용하는 것에 대한 여러 게시물을 읽었지만 나를 위해 작동하지 않기 때문에 무언가를 놓치고 있어야합니다. 내 활동 A는 매니페스트에 launchmode = "singleTop"이 있습니다. launchmode = "singleInstance"로 활동 B를 시작합니다. 활동 B는 브라우저를 열고 수신하고 다시 인 텐트하기 때문에 singleInstance입니다. 사용자가 활동 A로 다시 보내지도록 뒤로 버튼을 재정의하려고 한 다음 활동 B로 다시 돌아가는 대신 뒤로를 눌러 활동을 종료 할 수 있습니다.

// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
  && keyCode == KeyEvent.KEYCODE_BACK
  && event.getRepeatCount() == 0) onBackPressed();
 return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
 startActivity(new Intent(this, UI.class)
 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
 return;
}

브라우저에서 돌아온 후 스택은 ... A, B, Browser, B

이 코드는 스택을 ... A ...로 변경하여 다시 한 번 뒤로 누르면 사용자가 홈 화면으로 돌아갑니다.

대신 스택을 ... A, B, Browser, B, A ... 그 플래그가없는 것처럼 변경하는 것 같습니다.

startActivity 후 활동 B에서 finish () 호출을 시도했지만 뒤로 버튼을 누르면 브라우저로 다시 돌아갑니다!

내가 무엇을 놓치고 있습니까? 감사합니다!

답변:


72

@bitestar에는 올바른 솔루션이 있지만 한 단계 더 있습니다.

그것은 그러나 당신은 변경해야합니다, 워드 프로세서에 숨겨져 된 launchMode의를 Activity이외의 다른 standard. 그렇지 않으면 맨 위로 재설정되는 대신 파괴되고 다시 생성됩니다.


51
사실 .. Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP그렇게하겠습니다.
Derk-Jan

Steel_fedex의 솔루션을 확인하십시오.
Darpan 2014 년

2
그래서 도대체 Steel_fedex의 솔루션은 어디입니까?!
정창원 Juicycool

112

활동 A-> B-> C-> D를 시작했습니다. 활동 DI에서 뒤로 버튼을 누르면 활동 A로 이동하고 싶습니다. A가 내 시작 지점이므로 이미 스택에 있으므로 A 상단의 모든 활동이 지워지고 A에서 다른 활동으로 돌아갈 수 없습니다. .

이것은 실제로 내 코드에서 작동합니다.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent a = new Intent(this,A.class);
        a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(a);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}       

4
이 솔루션은 모든 중개 활동을 종료합니다. 또한 RootActivity를 다시 시작합니다. 아래 @Steel_Fedex의 솔루션을 확인할 수 있습니다. 동일하지만 RootActivity를 다시 시작하지 않습니다.
Darpan 2014 년

이것은 제 경우에 가장 적합한 솔루션입니다. 실제로 원하는 다시 시작하는 루트 활동을
Tash Pemhiwa

24

이를 위해, 내가 사용하는 FLAG_ACTIVITY_CLEAR_TOP시작하는 플래그 Intent
(없이 FLAG_ACTIVITY_NEW_TASK)

launchMode = "singleTask"실행 활동에 대한 매니페스트있다.

필요에 따라 작동하는 것 같습니다. 활동이 다시 시작되지 않고 다른 모든 활동이 닫힙니다.


Bitster의 솔루션이 작동하지 않는지 확인했습니다. 이 솔루션이 작동하는 동안. RootActivity가 다시 시작되지 않았습니다.
Darpan 2014 년

더 현명하게 단어를 선택하십시오. Bitestar 솔루션은 실제로 작동합니다!
Jesper Bischoff-Jensen 2014

singleTask는 나를 위해 작동하므로 Activity가 다시 생성되지 않고 onNewIntent에서 이벤트를 처리합니다.
Jishi 첸

11

이 질문에 이미 충분한 답변이 있지만 누군가이 플래그가 왜 이런 독특한 방식으로 작동하는지 알고 싶어 할 것이라고 생각했습니다. 이것은 Android 문서 에서 찾은 것입니다.

위의 예에서 현재 실행중인 활동 B의 인스턴스는 여기에서 시작하는 새 인 텐트를 onNewIntent () 메서드에서 받거나 자체적으로 완료되고 새 인 텐트로 다시 시작됩니다.

시작 모드를 "multiple"(기본값)로 선언하고 동일한 인 텐트에서 FLAG_ACTIVITY_SINGLE_TOP를 설정하지 않은 경우 완료되고 다시 생성됩니다. 다른 모든 시작 모드의 경우 또는 FLAG_ACTIVITY_SINGLE_TOP가 설정된 경우이 Intent는 현재 인스턴스의 onNewIntent ()에 전달됩니다.


그래서,
1 . launchMode활동 A를 표준에서 다른 것으로 변경하십시오 (예 : singleTask또는 무언가). 그러면 플래그 FLAG_ACTIVITY_CLEAR_TOP가 활동 A를 다시 시작하지 않습니다.

또는,

2 . Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP깃발로 사용하십시오 . 그러면 원하는 방식으로 작동합니다.


8

문제를 해결하기 위해 세 가지 플래그를 사용합니다.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK | 
                Intent.FLAG_ACTIVITY_NEW_TASK);

4

매니페스트 파일에 android : noHistory = "true"를 추가합니다.

<manifest >
        <activity
            android:name="UI"
            android:noHistory="true"/>

</manifest>

처음이 플래그를 볼 수 있지만, 내 경우에 대한 감사 일
vlasentiy

3

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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

그러나 그것은 나를 위해 작동하지 않습니다 ... 나는이 솔루션을 사용하도록 제안하지 않지만 플래그 설정이 작동하지 않으면 이것을 시도 할 수 있습니다 ..하지만 여전히 사용하지 않는 것이 좋습니다.


2

이미 받아 들여진 답변이 있다는 것을 알고 있지만 FLAG_ACTIVITY_CLEAR_TOP이 특정 경우에 의미가 없다고 생각하기 때문에 OP에서 어떻게 작동하는지 알 수 없습니다. 이 플래그는 동일한 작업의 활동에만 관련됩니다 . 그의 설명에 따라 각 활동은 A, B 및 브라우저와 같은 자체 작업에 있습니다.

그를 쫓아내는 것은 A가 singleTask이어야 할 때 singleTop이라는 것입니다. A가 singleTop이고 B가 A를 시작하면 A가 B의 작업에 없기 때문에 새 A가 생성됩니다. singleTop에 대한 문서에서 :

"활동의 인스턴스가 이미 현재 작업 의 맨 위에있는 경우 시스템은 인 텐트를 해당 인스턴스로 라우팅합니다 ..."

B가 A를 시작하기 때문에 현재 작업은 B의 작업이며, 이는 단일 인스턴스 용이므로 A를 포함 할 수 없습니다. singleTask를 사용하여 원하는 결과를 얻을 수 있습니다. 그러면 시스템이 A가있는 작업을 찾고 해당 작업을 포 그라운드로 가져 오기 때문입니다.

마지막으로 B가 A를 시작하고 사용자가 A에서 뒤로 눌렀을 때 OP는 B 또는 브라우저를보고 싶지 않습니다. 이를 위해 B에서 finish ()를 호출하는 것이 정확합니다. 다시 말하지만 FLAG_ACTIVITY_CLEAR_TOP는 A의 다른 활동이 모두 다른 작업에 있기 때문에 A의 작업에서 다른 활동을 제거하지 않습니다. 그가 빠진 부분은 B가 브라우저에 대한 인 텐트를 실행할 때 FLAG_ACTIVITY_NO_HISTORY도 사용해야한다는 것입니다. 참고 : OP의 응용 프로그램을 시작하기 전에 브라우저가 이미 실행 중이면 물론 A에서 뒤로 눌렀을 때 브라우저가 표시됩니다. 따라서 실제로 이것을 테스트하려면 응용 프로그램을 시작하기 전에 브라우저를 종료해야합니다.


1

FLAG_ACTIVITY_NEW_TASK는 여기에서 새 작업을 시작하는 문제입니다. 제거하면 완료됩니다.

모든 플래그가 작업하기 전에 무엇을하는지 읽어 보는 것이 좋습니다.

읽기 & 여기 의도 플래그


1
나는 깃발을 읽었고 내가 필요한 것처럼 들렸다. 그럼에도 불구하고 FLAG_ACTIVITY_NEW_TASK를 제거해도 결과에는 영향을 미치지 않습니다. 여전히 끝없는 뒤로 버튼 루프입니다 ... A-> B, 다시 A로, 다시 B로, 다시 A로 ...
piusvelte 2010

B를 singleInstance로 사용하는 이유가 확실합니까? AA "singleInstance"활동은 FLAG_ACTIVITY_NEW_TASK가 의도에있는 것처럼 작동합니다. developer.android.com/guide/topics/fundamentals.html
100rabh

B는 브라우저에서 콜백 된 인 텐트를 수신해야합니다. 시작 모드를 singleTask로 변경하려고 시도했지만 여전히 작동하지만 뒤로 버튼 루핑이 여전히 발생합니다.
piusvelte

FLAG_ACTIVITY_NEW_TASK를 사용했기 때문에 작동하지 않았다고 생각합니다. FLAG_ACTIVITY_CLEAR_TOP 만 사용하고 singleTask도 singleInstance도 사용하지 않는 것이
좋습니다.

1
난 당신이 추가 할 경우 즉, 작업 솔루션을해야한다고 생각 Intent.FLAG_ACTIVITY_SINGLE_TOP재창조 방지하기 위해
yonojoy

1

처음에는 FLAG_ACTIVITY_CLEAR_TOP가 작동하는 데 문제가있었습니다. 결국 나는 그것의 가치 (0x04000000)를 사용하여 작동하게했습니다. 이클립스 / 컴파일러 문제가있는 것 같습니다. 그러나 불행히도 살아남은 활동이 다시 시작됩니다. 그래서 쉬운 해결책이없는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.