기타/Android

[AndroidStudio 정리] 안드로이드 태스크 ( Android Task, Activity Stack)

yujindonut 2021. 12. 1. 00:31
728x90

Android Task

-Task는 어플리케이션에서 실행되는 액티비티를 보관하고 관리

-Stack 형태의 연속된 Activity로 이루어진다

 

-선입후출(First In Last Out)형태로 나중에 적재된 액티비티일 수록 가장 먼저 사용된다

예) 1화면 -> 2화면 -> 3화면 순으로 액티비티를 이동하였을때 실행순서대로 Task에 Push됨

뒤로가기 버튼을 누르면 3화면 -> 2화면 -> 1화면 순으로 Task에서 pop시켜 되돌아간다.

 

-최초 적재 액티비티는 RootActivity라고 하며 어플리케이션 런처로부터 시작된다

-마지막으로 적재되는 액티비티는 Top Activity라고 하며 현재 화면에 활성화 되어있는 액티비티를 말한다.

 

-Task의 스택에 넣어져있는 액티비티들은 모두 background와 foreground로 함께 이동한다. 

예) - 홈버튼 클릭(task interrupt -> background이동 )

     - 홈버튼 롱클릭 ( recent task -> foreground이동 )

 

-Activity는 Stack에 여러번 인스턴스화 될 수 있다. 

※인스턴스란
설계도를 바탕으로 소프트웨어에 구현된 구체적인 실체
클래스 타입으로 선언되었을때 : 객체
객체가 메모리에 할당되어 실제 사용될때 : 인스턴스
객체를 클래스의 인스턴스 라고도 한다.

인스턴스화 : 구체적으로 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것을 말한다.

Intent Flag 을 사용해야하는 이유

-Activity를 호출하다 보면 Activity에 대해 중복 문제가 발생하곤한다. 중복을 방지하거나, Activity에 대한 흐름을 제어하고 싶을 때 사용한다.

 

-AndroidManifest에서 제어

 

<activity android:launchMode= “사용하고자 하는 속성”></>

  • standard : Stack 중 어느 곳에나 위치 할 수 있으며, 여러개의 인스턴스가 생성 가능하다.
  • singleTop : Stack 중 어느 곳에나 위치 할 수 있으며, 여러개의 인스턴스가 생성 가능하고 호출한 Activity와 최상위 Activity가 동일한 경우 최상위 Activity가 재사용되고, 기존 최상위 Activity는 pop() 처리됨
  • singleTask : Root Activity로만 존재하며 하나의 인스턴스만 생성 가능, 다른 액티비티 실행시 동일 Task 내에서 실행 가능
  • singleInstance : Root Activity로만 존재하며 하나의 인스턴스만 생성 가능, Task 내에 해당 Activity 하나만 속할 수 있다. 다른 Activity를 실행시키면 새로운 Task가 생성되어 그 Task에 포함되게 된다.

-소스 코드로 제어

Intent.addFlags() 메서드 또는 Intent.setFlags() 사용

Ex) intent.addFlags(Intent.사용 플래그);

 

< addFlags()와 setFlags()의 차이 >

addFlags() : 새로운 flag를 기존 flag에 붙임

setFlags() : 오래된 flag 전체를 대체

 

  • FLAG_ACTIVITY_BROUGHT_TO_FRONT

시스템 디폴트값, 같은 Task에 Activity가 있을 경우에 Activity 실행모드가 singleTask이면 자동으로 설정됨

  • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

Task가 리셋될 때 플래그가 사용된 Activity부터 위의 Activity가 모두 삭제됨

Ex) ABCD → B call → AB

  • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

시스템에 의해 홈에서 사용자에 의해 백그라운드에 있던 Task가 포그라운드로 전환될 때에 항상 붙게 됨

Intent를 이용하여 새로운 Task를 생성하거나 존재하고 있는 Task를 포그라운드로 가져오는 경우가 아닌 경우에는 아무런 효과가 없다.

  • FLAG_ACTIVITY_CLEAR_TOP

호출하는 Activity가 스택에 있을 경우, 해당 Activity를 최상위로 올리면서, 그 위에 있던 Activity들을 모두 삭제하는 Flag

RootActivity와 동일한 Activity만 남긴 후 Stack에 쌓여 있는 나머지 Activity를 모두 onDestroy() 시키는 Flag

속성이 적용된 Activity는 onCreate()부터 시작됨

Ex) ABCDE → C call → ABC

cf) onCreate()가 아닌 재사용만 하고 싶을 경우, FLAG_ACTIVITY_SINGLE_TOP 속성과 같이 사용하면 됨

 
 
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

최근 실행목록에 표시하지 않길 원하는 Activity가 있을 경우 사용하면 표시되지 않음

  • FLAG_ACTIVITY_FORWARD_RESULT

startActivityForResult를 이용해서 Activity를 호출한 이후, 호출하는 쪽이 아닌 한번 더 거쳐서 Result를 받고 싶은 경우에 쓰임

Ex) A → B → C , C에서 setResult 설정, B에서 finish 하게 되면 A → C 로 값을 받을 수 있게 됨

  • FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

시스템에 의해서 설정되는 Flag, 최근 실행목록에서 실행되게 되면 자동으로 설정됨

  • FLAG_ACTIVITY_MULTIPLE_TASK

FLAG_ACTIVITY_TASK와 함께 사용하여야 하며, 두 개의 Flag를 동시에 사용할 경우Task는 재활용되지 않고 무조건 새로 생성되며, 피호출되는 Activity는 새로운 Task의 최상위 Activity가 됨

  • FLAG_ACTIVITY_NEW_TASK

새로운 Task를 생성하여 그 Task 안에 Activity를 추가할 때 사용, 기존에 있던 Task들 중에 생성하려는 Activity와 동일한 Affinity를 가지고 있는 Task가 있다면 그 곳으로 Activity가 들어가게 됨

 

<Affinity>

Activity들은 하나의 Affinity를 가지고 있다.

 

AndroidManifest에서 <activity> 태그의 taskAffinity 속성을 사용해 개별로 affinity를 지정할 수 있다.

 

FLAG_ACTIVITY_NEW_TASK Flag를 가진 Intent 객체로부터 호출된 allowTaskReparenting 속성을 True로 가지고 있는 Activity에 한해 Affinity가 동작한다.

 

하나의 어플리케이션 내에서 하나 이상의 기능을 갖는 어플리케이션이 있을 경우 각 액티비티별로 다른 Affinity를 지정해 관리 할 수 있다.

  • FLAG_ACTIVITY_NO_ANIMATION : Activity 전환 시 애니메이션 무시
  • FLAG_ACTIVITY_NO_HISTORY : Activity가 Stack에 쌓이지 않게 함, 로딩 화면(SplashActivity) 등에 사용
 
 
  • FLAG_ACTIVITY_SINGLE_TOP

호출되는 Activity가 최상위에 있을 경우 해당 Activity를 다시 생성하지 않고, 있던 Activity를 다시 사용

cf) 동일한 Activity가 연속적으로 사용되어야만 Flag Activity가 적용됨

재사용 Activity는 onPause(), onNewIntent(), onResume() 순서로 동작하게 됨

Ex) ABC → C call → ABC

 
 
  • FLAG_ACTIVITY_REORDER_TO_FRONT

실행하고자 하는 Activity가 Task에 있으면생성하는 대신 순서를 가장 위로 올림

순서를 역전해서 올리기 때문에 잘못 사용하게 되면 Activity의 흐름이 꼬일 수 있는 문제점이 있다.

 

 

액티비티를 작업의 진입 지점으로 설정하려면

    <activity ... >
        <intent-filter ... >
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        ...
    </activity>

사용자는 Task를 떠났다가 이 액티비티 launcher를 사용하여 나중에 작업에 돌아올 수 있어야 한다.

이러한 이유로, 액티비티가 항상 Task를 시작하는 것으로 표시하는 두 가지 launch mode, 즉 “singleTask” 및 “singleInstance”는 액티비티에 ACTION_MAIN 및 CATEGORY_LAUNCHER 필터가 있을 때에만 사용되어야 한다고한다.

 

 

 

https://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-%ED%83%9C%EC%8A%A4%ED%81%AC%EB%9E%80-Task-Activity-Stack-%EC%96%B4%ED%94%BC%EB%8B%88%ED%8B%B0%EB%9E%80-Android-Affinity-%ED%94%8C%EB%9E%98%EA%B7%B8%EB%9E%80

 

안드로이드/Android 태스크란? (Task, Activity Stack) 어피니티란? (Android Affinity) 플래그란? (Android Flag)

안드로이드/Android 태스크란? (Task, Activity Stack) 어피니티란? (Android Affinity) 플래그란? (Android Flag) 태스크란? (Task, Activity Stack) 어피니티란? (Android Affinity) 플래그란? (Android Flag)..

arabiannight.tistory.com

https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html

 

[Java] 클래스, 객체, 인스턴스의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://vzio.tistory.com/73

 

[안드로이드] Intent(4) - 인텐트 플래그를 이용한 Activity 스택 관리

[안드로이드] Intent(4) - 인텐트 플래그를 이용한 Activity 스택 관리 4. 인텐트 플래그를 이용한 Activity 스택 관리 => 사용법 : intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); ▪ FLAG_ACTIVITY_SINGLE_..

vzio.tistory.com

https://onemask514.tistory.com/43

 

[Android] Android Stack 관리 / 확인하기

안드로이드 앱은 여러 개의 Activity로 관리된다. 오늘은 여러 개의 Activity를 관리/확인 하는 법에 대해 알아보자. # Activity Stack 여러 Activity 는 Stack 형태로 관리된다. OneActivity에서 TwoActivity를..

onemask514.tistory.com

https://colinch4.github.io/2020-12-01/Activity(3)-Activity-Task-and-Back-Stack/ 

 

colin's 블로그

개발 강좌 블로그

colinch4.github.io

 

728x90