Activity 컴포넌트 및 intent 개념

두리두두·2024년 4월 20일

Android

목록 보기
8/25

Activity

  • 화면!!!!!!!!!!!
  • 액티비티, 브로드캐스트, 서비스, 콘텐츠프로바이더 컴포넌트들은 시스템이 생성해서 실행하는 클래스이기 때문에 개발자가 작성하는 코드로 생명주기를 관리할 수 없음!!
  • 액티비티 클래스에서 다른 액티비티를 직접 호출해서 사용할 수도 없음.
    => Intent 필요
  • 액티미티 클래스 하나 당 < activity > 태그로 매니페스트 파일에 등록해둬야 시스템이 인지할 수 있음!!!

Intent

  • 컴포넌트를 실행하는 정보를 담은 데이터
  • 메인에서 디테일 액티비티 실행해달라고 시스템에 인텐트 전달하는 코드
  • 그냥 호출만 하는게 아니라 정보를 담아야한다면 intent.putExtra() 사용
	val intent: Intent = Intent(this, DetailActivity::class.java)
    // 정보 담기
    intent.putExtra("data1", "HELLO")
    intent.putExtra("data2", "BYE")
    startActivity(intent)

intent 실행 방법

1. startActivity(인텐트)

  • 인텐트 실행 후 사후 처리가 필요 없을 때.

2. startActivityForResult() (지금은 잘 사용 X)

  • 안드로이드 11 즈음 부터 사용 권장 X
  • (1) MainActivity.kt
	startActivityForResult(intent,10)
  • (2) DetailActivity.kt
	// 메인에 돌려보낼 정보 세팅
    intent.putExtra("resultData","world")
    // ResultCode 세팅
    setResult(RESULT_OK, intent)
    finish()
  • (3) 다시 MainActivity.kt에서 결과 돌려받기
  • 인텐트 결과 돌아오면 자동으로 onActivityResult 호출됨!!
	override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?){
    	super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 10 && resultCode == Activity.RESULT_OK){
        	val result = data?.getStringExtra("resultData")
            }
         }

3. ActivityResultLauncher

  • 최근 권장하는 방식 (2번과 다르게 requestCode를 설정하지 않음)
  • 인텐트 응답이 돌아왔을 때 ActivityResultLauncher로 사후 처리 하는 방법
  • ActivityResultLauncher를 만들어서 그걸로 인텐트를 실행
  • 이 런처에는 contract와 callback 객체를 담고있고, 런처는 registerForActivityResult()함수로 만듦
	val requestLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
    	ActivityResultContracts.StartActivityForResult())
        {
        	val resultData = it.data?getStringExtra("result")
            binding.mainResultView.text = "result : $resultData"
        }
  • 만들어진 런처 실행(인텐트 실행)
	val intent: Intent = Intent(this, DetailActivity::class.java)
    requestLauncher.launch(intent)

Permission
registerForActivityResult 권한 체크에도 사용할 수 있다.

  • contracts 부분이 startActivity가 아니라 requestPermissions으로 사용!
	private val cameraResultLauncher : ActivityResultLauncher<String> =
        // 버튼을 누르면 권한 요청을 줄 메소드
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()) {
            // 대화상자로 권한을 요청한다.
                isGranted ->
                // boolean으로 권한이 승인 되었는지 확인한다.
                if(isGranted) {
                    Toast.makeText(this,
                        "카메라 권한 승인", Toast.LENGTH_LONG).show()
                } else {
                    Toast.makeText(this,
                        "카메라 권한 거절", Toast.LENGTH_LONG).show()
                }
            }

intent filter

  • 인텐트는 명시적 인텐트와 암시적 인텐트로 나뉜다.

(1) 명시적 인텐트

  • 클래스 타입 레퍼런스 정보를 활용한 인텐트
  • 앱 내부 액티비티 사용할 때
	val intent: Intent = Intent(this, DetailActivity::class.java)

(2) 암시적 인텐트

  • 인텐트 필터 정보를 활용한 인텐트
  • 매니페스트 파일에 선언된 인텐트 필터 사용
<activity android:name=".TwoActivity"
          	android:exported="true">
  	<intent-filter>
      	<action android:name="ACTION_EDIT"/>
    </intent-filter>
</activity>
  • 인텐트 필터 하위에는 <action>(VIEW, DIAL 등), <category>(BROWSABLE, APP_CACULATOR 등), <data>(실행될 컴포넌트가 필요로 하는 데이터 위치, uri로 저장) 태그를 이용해 정보를 설정할 수 있음
  • 위의 매니페스트 파일을 가지고 있는 앱에 인텐트를 보내기 위한 코드
	val intent = intent()
    intent.action = "ACTION_EDIT"
    intent.data = Uri.parse("http://www.google.com")
    // 인텐트에 카테고리 정보 지정하지 않으면 DEFALUT로 감
    startActivity(intent)
profile
야금야금 앱 개발자

0개의 댓글