개발 일기

Intent Flag ? 본문

Client/안드로이드

Intent Flag ?

이건욱

Intent Flag

개발을 진행을 하다보면 Activity에 대한 흐름을 제어 및 중복을 방지하고 싶을 때 주로 사용을 합니다.

Intent에서는 Stack 구조로 Activity을 저장하고 있습니다.

 

 

사용법

AndroidManifest 에서 제어법

<activity android:launchMode="속성">

standard

 Stack에서 어느곳이나 위치가 가능하며, 여러개의 인스턴스도 생성이 가능합니다.

 

singleTop 

 여러개의 인스턴스가 생성이 가능하고 , 최상위 Activity가 동일한 경우 최상위 Activity가 재사용되고 기존에 있던 Activity는 사라집니다.

 

singleTask

 Root Activity로만 가능하고, 하나의 인스턴스만 생성이 가능합니다. 다른 액티비티를 실행시 동일한 Task에서 실행이 가능합니다.

 

singleInstance 

Root Activity로만 가능하고, 하나의 인스턴스만 생성이 가능합니다. 하지만 해당 Task내에 Activity 하나만 포함이 될수 있고 , 다른 Activity을 실행하게 될때 새로운 Task로 생성합니다.

 

 

FLAG_ACTIVITY_CLEAR_TOP

 

호출하는 Activity가 Stack 존재할 경우, 해당 Activity를 최상위로 올리면서, 그 위에 있던 Activity를 모두 삭제합니다.

속성이 적용된 Activity는 onCreate() 부터 호출이 됩니다.

(재사용을 원하신다면 FLAG_ACTIVITY_SINGLE_TOP 같이 사용을 해야합니다.)

 

ex) A -> B -> C -> D -> E -> B 로 이동을 했을때 Stack이 다음과 같이 A -> B 만 존재하게 됩니다.

 

FLAG_ACTIVITY_FORWARD_RESULT

 

예를 들어 :) A -> B -> C를 startActivityForResult 이동을 하게 된다면 C에서 setResult을 하게 될경우 B에서 응답을 받게 됩니다.

하지만 C에서 했을 때 A에 onActivityResult에서 데이터를 받고 싶은 경우에 사용 할수가 있습니다

[예시]

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        container.setBackgroundColor(Color.GREEN)
        container.setOnClickListener {
            moveActivityResult<SubActivity>(this)
        }

        textView.text = "FirstActivity"
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        println("onActivityResult")
    }
}
// Function
inline fun <reified T : Activity> Activity.moveActivity(
    context: Context,
    vararg flags : Int
) {
    Intent(context, T::class.java).apply {
        for (i in flags){
            addFlags(i)
        }
        startActivity(this)
    }
}
// Function
inline fun <reified T : Activity> Activity.moveActivityResult(
    context: Context,
    vararg flags : Int
) {
    Intent(context, T::class.java).apply {
        for (i in flags){
            addFlags(i)
        }
        startActivityForResult(this , 1001)
    }
}
class SubActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        container.setBackgroundColor(Color.YELLOW)
        container.setOnClickListener {
            moveActivity<ThreeActivity>(this , Intent.FLAG_ACTIVITY_FORWARD_RESULT)
            finish()
        }
        textView.text = "TwoActivity"
    }
}
class ThreeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        container.setBackgroundColor(Color.CYAN)
        container.setOnClickListener {
            setResult(Activity.RESULT_OK)
            finish()
        }
        textView.text = "ThreeActivity"
    }
}

FLAG_ACTIVITY_NO_ANIMATION 

Acitivity 전환시 애니메이션 무시

 

FLAG_ACTIVITY_NO_HISTORY 

Activity가 Stack에 저장되지 않습니다.

 

FLAG_ACTIVITY_SINGLE_TOP

호출하는 Activity가 이미 최상위에 존재한다면 Activity를 다시 생성하지 않습니다.

 

FLAG_ACTIVITY_REORDER_TO_FRONT

호출하는 Activity가 동일한 Task에 이미 존재한다면 생성하는 대신 순서를 가장 위로 올립니다.

(순서가 꼬일 가능성이 있기 때문에 한 다음에는 테스트를 진행을 다 해봐야 합니다!.)

 

FLAG_ACTIVITY_MULTIPLE_TASK

FLAG_ACTIVITY_NEW_TASK와 함께 사용을 해야하고 ,

두개를 동시에 했을 때에는 Task가 재활용 되지 않고 계속 생성됩니다.

피호출되는 Activity는 새로운 Task의 최상위 Activity가 됩니다.

 

FLAG_ACTIVITY_NEW_TASK

새로운 Task을 생성합니다. 기존에 Affinity를 입력하지 않을 경우에는 앱의 패키지명으로 들어가게 됩니다.

그래서 새로운 Task로 들어가는 것이 아닌 기존에 Task에 추가하게 됩니다.

 

(Affinity는 . 을 하나 이상 포함해야합니다.)

'Client > 안드로이드' 카테고리의 다른 글

ConstraintLayout - Barrier  (0) 2020.05.21
ConstraintLayout - Chains  (0) 2020.05.20
Auto animate layout updates ?  (0) 2020.05.15
zoom animation ?  (0) 2020.05.14
Move views using a fling animation ?  (0) 2020.05.12
Comments