[안드로이드 프로그래밍] Activity 실행

PUJIN·2023년 7월 1일
0

android programming

목록 보기
12/26
post-thumbnail



Intent


  • 실행하고자 하는 4대 구성요소와 관련된 정보
  • 실행하고자하는 activity에 데이터 전달 가능 → Intent로 해당 activity의 데이터 추출
  • 관련 정보를 Intent에 저장 → 안드로이드 OS로 전달 → 안드로이드 OS에 의해 실행 + Intent 객체 전달
// intent 객체 생성
val secondIntent = Intent(this@MainActivity, SecondActivity::class.java)
val resultIntent = Intent()



activity 실행


  • startActivity : 지정된 Intent에 담긴 정보로 activity 실행
startActivity(secondIntent)
  • setResult
    • 다시 원래 activity로 돌아갈 때 전달할 내용이 있는 경우 : 2번째 매개변수에 Intent 객체 입력
    • 2번째 매개변수에 intent 객체를 설정하지 않는 경우 : null 값 반환
setResult(RESULT_OK)
setResult(RESULT_OK, secondIntent)
  • finish : 현재 activity 종료 후 backStack에서 제거
finish()

  • startActivityForResult : activity에서 다른 activity를 실행하고 다시 돌아왔을 때 처리가 필요한 경우 사용
    • 앞의 activity 관련 데이터가 필요한 경우 안드로이드 OS로 전달
    • requestCode : activity를 구분하기 위해 사용하는 값
      • 다른 activity를 실행하고 다시 돌아왔을 때 requestCode로 구분하여 코드 처리
// requestCode 설정
val SECOND_ACTIVITY = 0
startActivityForResult(secondIntent,SECOND_ACTIVITY)
  • onActivityResult : startActivityForResult 메서드로 다른 activity 실행 후 다시 돌아왔을 때 자동으로 호출되는 메서드 → registerForActivityResult 사용
    • resultCode : 작업 결과를 구분하기 위해 사용하는 값
      • RESULT_OK : 작업이 정상적으로 끝났다는 것 의미
      • RESULT_CANCELED : 작업이 취소 되었다는 것 의미
        • backButton으로 돌아온 경우
      • RESULT_FIRST_USER : 작업의 상황을 더 추가적으로 정의하고 싶을 때 사용 (+1, +2, +3…)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
	super.onActivityResult(requestCode, resultCode, data)
	when(requestCode){
		SECOND_ACTIVITY -> {
			activityMainBinding.textView.text = "SecondActivity 실행 후 복귀"
			when(resultCode){
				RESULT_OK -> {
                	activityMainBinding.textView.append("작업 성공")
				}
				RESULT_CANCELED -> {
                	activityMainBinding.textView.append("작업 취소")
				}
			}
		}
		THIRD_ACTIVITY -> {
			activityMainBinding.textView.text = "ThirdActivity 실행 후 복귀"
		}
	}
}

  • registerForActivityResult : 다른 activity를 실행했다가 다시 돌아왔을 때 실행되는 메서드
    • 계약 객체 생성
    • 다수의 activity를 분리해서 관리할 수 있다.
    • it.resultCode : 작업 결과를 구분하기 위해 사용하는 값
    • it.data : Intent 객체
      • 데이터 추출하여 사용
val c1 = ActivityResultContracts.StartActivityForResult()
	val secondActivityLauncher =  registerForActivityResult(c1){
		if(it.resultCode == RESULT_OK){
			val data1 = it.data?.getIntExtra("data1", 0)
			val data2 = it.data?.getDoubleExtra("data2", 0.0)
		}
	}
}

activityMainBinding.run {
	button.run {
      val secondIntent = Intent(this@MainActivity, SecondActivity::class.java)

      secondIntent.putExtra("data1", 100)
      secondIntent.putExtra("data2", 11.11)

      secondActivityLauncher.launch(fourthIntent)
	}
}



데이터 전달


  • Intent 객체에 데이터 저장 가능
  • putExtra : Intent에 데이터를 저장하는 메서드
    • Intent로 실행되는 activity까지 데이터 전달
val secondIntent = Intent(this@MainActivity,SecondActivity::class.java)

secondIntent.putExtra("data1", 100)
secondIntent.putExtra("data2", 11.11)
secondIntent.putExtra("data3", true)
secondIntent.putExtra("data4", "데이터")
  • getExtra : Intent에 저장된 데이터를 추출하는 메서드
    • 자료형에 맞는 메서드 사용
    • default value : 저장된 이름과 저장된 데이터가 없을 경우 사용할 기본 값 설정 (기본 자료형)
      • 설정된 기본값이 없는 경우 : null 반한
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
	super.onActivityResult(requestCode, resultCode, data)
    if(data != null){
        val data1 = data.getIntExtra("data1", 0)
        val data2 = data.getDoubleExtra("data2", 0.0)
        val data3 = data.getBooleanExtra("data3", false)
        val data4 = data.getStringExtra("data4")

        activityMainBinding.run {
            textView.append("${data1}")
            textView.append("${data2}")
            textView.append("${data3}")
            textView.append("${data4}")
        }
    }
}



객체 전달


객채의 값을 parcel에 객체 이용하여 intent에 저장한 후 사용 → 객체 자체를 intent에 저장 X
* parcel에 객체의 값 저장 → intent에 저장 → 객체 생성 후 값 저장 (저장된 parcel 객체 값 추출)

Parcelable

서로 다른 4대 구성요소에 객체를 전달하기 위한 객체 직렬화 수행

  • parcel에 저장한 순서대로 추출
  • writeToParcel : 객체를 Intent에 저장할 때 호출되는 메서드
    • parcel : 객체 복원에 필요한 값 설정
  • createFromParcel : Intent로부터 객체를 추출할 때 호출되는 메서드
    • 새로운 객체를 생성하고 parcel에 저장되어 있는 값을 객체 맴버 변수에 설정
class TestClass() : Parcelable {

	lateinit var name:String
    lateinit var age:Int 

    constructor(parcel: Parcel) : this() {
        name = parcel.readString()!!
        age = parcel.readInt()!!

    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<TestClass> {
        override fun createFromParcel(parcel: Parcel): TestClass {
            return TestClass(parcel)
        }

        override fun newArray(size: Int): Array<TestClass?> {
            return arrayOfNulls(size)
        }
    }
}
  • putExtra : intent에 값 전달
val t1 = TestClass()
t1.name = "pujin"
t1.age = 100
secondIntent.putExtra("data1", t1)
  • getExtra : 객체 복원
val data1 = intent.getParcelableExtra<TestClass>("data1")
textView.append("name : ${data1?.name}")
textView.append("age : ${data1?.age}")

0개의 댓글