Development Tip

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

yourdevel 2020. 10. 15. 21:49
반응형

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


나는 이것을 사용하는 것에 대한 여러 게시물을 읽었지만 나를 위해 작동하지 않기 때문에 무언가를 놓치고 있어야합니다. 내 활동 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 () 호출을 시도했지만 뒤로 버튼을 누르면 브라우저로 다시 돌아갑니다!

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


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

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


활동 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);
}       

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

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

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


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

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

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


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

또는,

2. Use Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP as your flag. Then it will work the way you desire.


Add android:noHistory="true" in manifest file .

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

</manifest>

I use three flags to resolve the problem:

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

I know that there's already an accepted answer, but I don't see how it works for the OP because I don't think FLAG_ACTIVITY_CLEAR_TOP is meaningful in his particular case. That flag is relevant only with activities in the same task. Based on his description, each activity is in its own task: A, B, and the browser.

Something that is maybe throwing him off is that A is singleTop, when it should be singleTask. If A is singleTop, and B starts A, then a new A will be created because A is not in B's task. From the documentation for singleTop:

"If an instance of the activity already exists at the top of the current task, the system routes the intent to that instance..."

Since B starts A, the current task is B's task, which is for a singleInstance and therefore cannot include A. Use singleTask to achieve the desired result there because then the system will find the task that has A and bring that task to the foreground.

Lastly, after B has started A, and the user presses back from A, the OP does not want to see either B or the browser. To achieve this, calling finish() in B is correct; again, FLAG_ACTIVITY_CLEAR_TOP won't remove the other activities in A's task because his other activities are all in different tasks. The piece that he was missing, though is that B should also use FLAG_ACTIVITY_NO_HISTORY when firing the intent for the browser. Note: if the browser is already running prior to even starting the OP's application, then of course you will see the browser when pressing back from A. So to really test this, be sure to back out of the browser before starting the application.


i called activity_name.this.finish() after starting new intent and it worked for me.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

But it won't work for me... I am not suggesting this solution for use but if setting flag won't work for you than you can try this..But still i recommend don't use it


FLAG_ACTIVITY_NEW_TASK is the problem here which initiates a new task .Just remove it & you are done.

Well I recommend you to read what every Flag does before working with them

Read this & Intent Flags here


Initially I also had problem getting FLAG_ACTIVITY_CLEAR_TOP to work. Eventually I got it to work by using the value of it (0x04000000). So looks like there's an Eclipse/compiler issue. But unfortunately the surviving activity is restarted, which is not what I want. So looks like there's no easy solution.

참고URL : https://stackoverflow.com/questions/4342761/how-do-you-use-intent-flag-activity-clear-top-to-clear-the-activity-stack

반응형