programing

Intent.FLAG_ACTIVITY_CLEAR_TASK와 Intent.FLAG_ACTIVITY_TASK_ON_HOME의 차이점

copyandpastes 2021. 1. 18. 22:14
반응형

Intent.FLAG_ACTIVITY_CLEAR_TASK와 Intent.FLAG_ACTIVITY_TASK_ON_HOME의 차이점


Android 문서에서 :

FLAG_ACTIVITY_CLEAR_TASK

Context.startActivity ()에 전달 된 Intent에 설정된 경우이 플래그는 활동이 시작되기 전에 활동과 연관된 기존 태스크가 지워지도록합니다. 즉, 활동은 비어있는 작업의 새로운 루트가되고 이전 활동은 완료됩니다. FLAG_ACTIVITY_NEW_TASK와 함께 만 사용할 수 있습니다.

FLAG_ACTIVITY_TASK_ON_HOME

Context.startActivity ()에 전달 된 Intent에 설정된 경우이 플래그는 새로 시작되는 작업이 현재 홈 활동 작업 (있는 경우) 위에 배치되도록합니다. 즉, 작업에서 뒤로를 누르면 사용자가 마지막으로 본 활동이 아니더라도 항상 사용자가 집으로 돌아갑니다. FLAG_ACTIVITY_NEW_TASK와 함께 만 사용할 수 있습니다.

다음 두 스 니펫을 고려하십시오.

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

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

내가 이해하는 방식으로 두 코드 스 니펫에서 활동 만있는 새 작업을 만들고 뒤로 누르면 홈 화면으로 이동합니다. 내가 아마도 착각했다고 가정하면 둘의 차이점은 무엇입니까? 또한 다른 스 니펫이 있으면 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK어떻게 동작할까요?


두 스 니펫간에 차이가 있습니다. 다음은 몇 가지 중요한 배경 정보입니다.

  • 작업에는 활동 스택이 포함됩니다. 작업은 포 그라운드 또는 백그라운드에있을 수 있습니다.

  • 작업도 "스택"됩니다. 당신이 작업에 있다면 A당신은 새로운 작업을 시작 B, 작업은 B작업 위에 쌓인됩니다 A. 사용자가 task에서 BACK 키를 충분히 누르면 B결국`A '로 돌아갑니다. 이것은 표준 Android 동작입니다.

스 니펫 ...

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

...에 따라 다음 작업 중 하나를 수행합니다.

  1. 경우 Activity현재 작업 (예 :이 코드가 실행되는 작업)와 같은 작업 친화력이, 현재의 작업 (작업의 모든 활동을 마무리) 지우고의 새 인스턴스를 시작합니다 Activity현재 작업에. 사용자가 BACK 키를 누르면이 작업이 완료 Activity되고 현재 작업도 완료되고 (작업에 활동이 하나만 있으므로) 사용자를 홈 화면 또는이 작업을 시작한 작업 (아래에있는 작업)으로 돌아갑니다. 이 작업은 작업 스택에서).
  2. 경우 Activity현재 작업과 다른 작업 친화력을 가지고 있으며, 그 작업 선호도와 기존 작업은 이미있는 (예 : 기존 작업 Activity에 속하는 것)가 다음 작업을 기존하는에서 (삭제 전경, 모든 활동을하게된다 작업이 완료되면의 새 인스턴스 Activity가 작업의 루트에 생성되고이 작업이 현재 작업의 맨 위에 놓입니다 ( Activity완료되면 사용자가 현재 작업으로 돌아갑니다).
  3. 경우 Activity현재 작업과 다른 작업 친화력을 가지고 있으며, 새로운 작업이 생성되는 작업 친 화성, 그리고 새로운 인스턴스와 기존 작업이없는 Activity작업의 루트에 생성되고이 작업은 현재의 상단에 넣어 작업 ( Activity완료되면 사용자가 현재 작업으로 돌아갑니다).

이 코드 스 니펫 ...

Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

...에 따라 다음 중 하나를 수행합니다.

  1. 경우 Activity현재 작업 (예 :이 코드가 실행되는 작업)와 같은 작업 친화력을 가지고 있으며, Activity현재 작업의 루트 활동을하고,이 아무것도 할 것입니다. 새 작업을 시작하지 않고 활동을 지우지 않으며의 새 인스턴스를 만들지 Activity않으며 현재 작업이 완료 될 때 발생하는 동작을 변경하지 않습니다 (예 : 현재 작업이 시작된 경우). 다른 작업은 현재 작업의 모든 활동이 완료되면 사용자를 작업 스택의 이전 작업으로 다시 떨어 뜨립니다.
  2. 경우 Activity(예 :이 코드가 실행되는 작업) 현재 작업과 동일한 작업 친화력을 가지고 Activity있다 되지 현재 작업의 루트 활동이 단순히의 새로운 인스턴스를 생성합니다 Activity현재 활동의 상단에 넣어 현재 작업에서. 새 작업을 시작하지 않고 활동을 지우지 않으며 현재 작업이 완료 될 때 발생하는 동작을 변경하지 않습니다 (예 : 현재 작업이 다른 작업에 의해 시작된 경우, 현재 작업의 모든 활동이 작업이 완료되면 사용자가 작업 스택의 이전 작업으로 돌아갑니다.)
  3. 경우 Activity현재 작업과 다른 작업 친화력을 가지고 있으며, 그 작업 선호도와 기존 작업을 이미 있습니다 (예 : 기존 작업 Activity에 속하는 것)과 Activity작업을 기존의 후 기존 작업이 데려 있다는 것을의 루트 활동 포 그라운드 및 해당 작업은 작업 스택에서 분리됩니다 (예 : 해당 작업의 모든 활동이 완료되면 해당 작업을 시작한 작업이 아닌 홈 화면으로 사용자를 반환합니다 ).
  4. 경우 Activity현재 작업과 다른 작업 친화력을 가지고 있으며, 그 작업 선호도와 기존 작업은 이미있는 (예 : 기존 작업 Activity에 속하는 것)하고 Activity있다 하지 작업을 기존의 후 기존 작업 가져되는 것을의 루트 활동 해당 작업이 작업 스택에서 분리되고 (즉, 해당 작업의 모든 활동이 완료되면 해당 작업을 시작한 작업이 아닌 홈 화면으로 돌아갑니다 )의 새 인스턴스 Activity가 생성됩니다. 해당 작업의 기존 활동 위에 배치합니다.
  5. 경우 Activity현재 작업과 다른 작업 친화력을 가지고 있으며, 새로운 작업이 생성되는 작업 친 화성, 그리고 새로운 인스턴스와 기존 작업이없는 Activity작업 스택에서 분리하는 작업과 새 작업의 루트에 생성됩니다 ( Activity완료되면 사용자는 시작된 작업이 아닌 홈 화면으로 돌아갑니다 .)

마지막으로이 스 니펫 ...

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

...에 따라 다음 작업 중 하나를 수행합니다.

  1. If Activity has the same task affinity as the current task (ie: the task from which this code is executing), it will clear the current task (finish all activities in the task) and launch a new instance of Activity into the current task. If the user presses the BACK key, this will finish Activity and also finish the current task (since there is only 1 activity in the task) and return the user to the HOME screen.
  2. If Activity has a different task affinity than the current task, and there is already an existing task with that task affinity (ie: an existing task that Activity would belong to), then that existing task is brought to the foreground, cleared (all activities in the task are finished), a new instance of Activity is created at the root of the task and this task is decoupled from the task stack (so that when Activity finishes, the user is returned to the HOME screen).
  3. If Activity has a different task affinity than the current task, and there is no existing task with that task affinity, a new task is created and a new instance of Activity is created at the root of the task and this task is decoupled from the task stack (so that when Activity finishes, the user is returned to the HOME screen).

I realize that this answer is long and complicated, but there are just so many different cases. I probably haven't even covered all the possible cases (for example, if Activity has a special launch mode)...

ReferenceURL : https://stackoverflow.com/questions/21833402/difference-between-intent-flag-activity-clear-task-and-intent-flag-activity-task

반응형