안드로이드 Task

이영준·2023년 4월 5일
0
post-thumbnail

📌 Task

관련된 실행 액티비티들을 순서대로 묶어 관리하는 것

  • 서로 다른 패키지의 액티비티가 실행되더라도 하나의 실행 흐름 안에 있도록 해준다.
  • Task는 스택 형태로 구성된다.

    뒤로가기를 누르면 top activity가 destroy 되고 다음 activity가 top이 됨
    맨 마지막의 root activity가 없어지면 task는 완전 종료됨

이 Task 제어가 필요한 이유는 여러 액티비티들이(중복되어) 스택 위에 들어왔을 때, 어떤 시점에서 뒤로 가기를 누르면 바로 전 액티비티가 아닌, 더 앞 지점으로 가야하는 경우가 있기 때문이다.

📌 액티비티 실행 모드

  • standard : activity 중복 허용하면서 task에 쌓임

  • singleTop : task 내의 top activity와 동일한 액티비티를 실행하면 기존의 것을 재사용

    • 가장 윗단의 액티비티가 자기 자신을 intent로 부르면 스택에 쌓지 않고 재사용하는 것이다.

    • activity의 시작점이 intent를 받는 부분이므로 재사용 시 전달되는 intent를 활용하는 방법이 필요하다.

    • onNewIntent(Intent intent)를 오버라이딩 하여 이를 새로운 인텐트가 들어왔음을 감지하여 실행한다.

  • singleTask : 모든 activity들이 중복될 경우 중복 허용하지 않고 재사용

  • singleInstance : 중복 허용 x, 혼자서 별도의 task를 구성

이 설정은 manifest로 애초부터 할 수도 있고, intent flag를 이용해서 runtime에 그때 그때 설정할 수도 있다.

🔑 Manifest에서 activity 속성으로 실행모드 설정

        <activity android:name=".Banking2Account" android:label="계좌조회"/>
        <!--<activity android:name=".Banking2Account" android:label="계좌조회" android:launchMode="singleTop"/>-->
        <!--<activity android:name=".Banking2Account" android:exported="true" android:label="계좌조회" android:launchMode="singleTask"/>-->
        <!--<activity android:name=".Banking2Account" android:exported="true"  android:label="계좌조회" android:launchMode="singleInstance"/>-->

🔑 flag 속성으로 설정

manifest에서

<activity android:name=".SubActivity1" android:noHistory="true"/>

위와 같이 속성으로 설정할수도 있고
(noHistory란 taskstack 에 쌓지 않는다는 의미)

        binding.btnCallSub1.setOnClickListener {
//            val intent = Intent(this, SubActivity1::class.java)
//            startActivity(intent)

            val intent = Intent(this, SubActivity1::class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NO_HISTORY
            }
            startActivity(intent)

        }

코드상으로 flag로 작성할 수도 있다.
둘 다 모두 subActivity를 no history로 하겠다는 의미이다.

🔑 flag 종류

  • FLAG_ACTIVITY_NO_HISTORY (==noHistory) : task stack에 쌓지 않음

  • FLAG_ACTIVITY_CLEAR_TASK : task내에서 다른 액티비티 모두 삭제함 (이 flag로 시작한 액티비티는 뒤로 가기 누르면 종료 됨)

    • FLAG_ACTIVITY_NEW_TASK와 같이 사용
  • FLAG_ACTIVITY_CLEAR_TOP : 기존에 있던 액티비티 제거하고(상위 포함) 새로운 액티비티 생성
    Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP 을 쓰면 기존의 액티비티가 나올때까지 상위 액티비티들을 재사용하고 기존 액티비티를 재사용한다.

등등 flag 종류는 많이 있다.

profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글