Notice

[안드로이드] Intent 정리

  • 앱 구성 요소(액티비티, 서비스, Broadcast Reciver, 콘텐츠 제공자)간 데이터 요구, 의사 전달, 요청

 

요청 관계

  1.  Activity와 Activity끼리 주고 받을 때
  2. Android System과 내 app 사이
  3. 다음 app과 내 app (앱끼리의 연동)   -> 무작정 사용 불가, 상호합의 필요

 

인텐트 유형

  • 명시적 인텐트 : 인텐트를 충족하는 대상을 지정해 요청
  • android:visibility="invisible"  : 특정 대상을 지정하지는 않지만 수행할 수 있는 대상에 요청

 

암시적 인텐트가 시스템을 통해 전달되어 다른 액티비티를 시작하는 방법

 

화면 전환

Intent1에서 Intent2로 화면 전환

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_intent.*


class Intent1 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent)


        change_activity.setOnClickListener {

            val intent = Intent(this@Intent1, Intent2::class.java)
            // this나 this@Intent1(this보다 정확)을 넣어주면 됨.
            // key, value 방식 or Dictionary -> key와 value를 쌍으로 만들어 저장한다.
           
            startActivity(intent)
        
        
        }
    }
}

 

Intent1                                                                                       Intent2

 


 

Activity간 데이터 전달

1. 명시적 인텐트

    1) Activity에서 데이터 보내기 : `putExtra` 사용

    2) Activity에서 데이터 받기 : `getExtra` 사용

 

1) Intent1에서 Intent2로 데이터 보내기

class Intent1 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent)


        change_activity.setOnClickListener {

            val intent = Intent(this@Intent1, Intent2::class.java)

           	/* 데이터 보내기 */
            intent.putExtra("number1",1)   
            intent.putExtra("number2",2)
            
            startActivity(intent)
      
        }
    }
}
  • Intent1에서 1을 가진 number1와 2의 값을 가진 number2 를 Intent2로 보낸다.

 

 val intent2 = Intent(this@Intent1, Intent2::class.java)
            // Apply -> intent 대신 this를 사용할 수 있게 해줌
            intent2.apply {
                this.putExtra("number1", 1)
                this.putExtra("number2", 2)
            }
            startActivity(intent2)  // 전달만 하는 요청
  • 앞에서 데이터를 보낸 방식과 결과는 같지만 다른 표현법.

 

 

 

2) Intent2에서 Intent1이 보낸 데이터 받기

class Intent2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent2)

        // 값을 받는다.
        // 값이 없을 경우를 대비해 default값을 넣어줌 -> 값이 없으면 0나옴
        val number1 = intent.getIntExtra("number1", 0)
        val number2: Int = intent.getIntExtra("number2", 0)

        num_data.text = number1.toString()
        
        
        // Log를 이용해 값 확인 가능
        Log.d("number", number1.toString())
        Log.d("number", number2.toString())

	}
}

 

Intent1에서 보낸 데이터 값을 Logcat에서 확인 할 수 있다.

 

 

Intent2에서 TextView를 이용해 값을 보여줄 수 있는 부분을 만들어 주었다.

`TextView`의 `id`를 `num_data`로 설정해주고, `num_data.text`를 통해 값을 액티비티에 나타낼 수 있다.

 

 

 

 

 

 

 

 

 

 


 

 

1) Intent2에서 Intent1으로 데이터 보내기

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_intent2.*

class Intent2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent2)


		result.setOnClickListener {

            	val number1 = intent.getIntExtra("number1", 0)
            	val number2: Int = intent.getIntExtra("number2", 0)

            	Log.d("number", number1.toString())
            	Log.d("number", number2.toString())

            	val result = number1 + number2
            	val resultIntent = Intent() // intent를 만들어 준다.
            	resultIntent.putExtra("result", result) // 만들어준 intent에 값을 넣는다


            	setResult(RESULT_OK, resultIntent)   // RESULT_OR는 -1임. 그냥 -1적는 것 보다 읽기가 편하다
           	 	// resultcode와 intent에 넣어줄 결과값(데이터)이 파라미터
            	// setResult(RESULT_CANCELED) canceled는 0

           		finish()    // -> Activity 종료
        }
    }	
            
}
  • `finish()`를 통해 Intent1에서 Intent2로 전환했던 화면을 다시 Intent1으로 되돌릴 수 있다.
  • `setResult`에 넣어준 `RESULT_OK`값은 -1 이지만 명시적으로 표현을 쉽게 하기 위해 `RESULT_OK`로 표현
  • `RESULT_CANCELED`는 0이다.

 

 

 

2) Intent1에서 Intent2가 보낸 데이터 받기

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_intent.*

class Intent1 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent)


        change_activity.setOnClickListener {

            val intent2 = Intent(this@Intent1, Intent2::class.java)
            // Apply -> intent 대신 this를 사용할 수 있게 해줌
            intent2.apply {
                this.putExtra("number1", 1)
                this.putExtra("number2", 2)
            }
            //startActivity(intent2)  		    // 전달만 하는 요청
            startActivityForResult(intent2, 200)    // 리턴을 받는 요청
            // int형인 requestCode가 필요
            // Intent2에 요청하는 액티비티가 Intent1말고도 여러 액티비티가 존재할 수 있다.
            // 따라서, 구분하는 이름을 숫자로 넣어줌. 
            // 이름이 200인 intent2를 intent1에 보내줌

        }
    }

    // 위의 intent의 결과를 받으려면 필요하다.
    // intent2의 setResult(RESULT_OR)가 resultCode에 들어감
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {


        if (requestCode == 200){    // 200인지 확인
            Log.d("number", requestCode.toString())     // 200
            Log.d("number", resultCode.toString())      // RESULT_OR이어서 -1

            val result = data?.getIntExtra("result", 0)
            Log.d("number", result.toString())
            // 데이터 값 1과 2를 합친 3이 나옴.
        }

        super.onActivityResult(requestCode, resultCode, data)
    }
}
  • `reseultCode`에는 Intent2에서 만들어준 `RESULT_OK (-1)`이, `data`에는 Intent2의 resultIntent 변수값이 들어온다.
  • `startActivity`는 전달만 하는 요청이라서 리턴을 받는 요청인 `startActivityForResult(intent, requestCode)`를 사용한다.
  • Intent2에 요청하는 액티비티가 하나이상일 수도 있기때문에, 어디서 요청이 왔는지 구분하는 `requestCode(int형)` 를 넣어주어야 한다. 

 

실행 후 Logcat을 살펴 보면 앞서 Intent1에서 보낸 데이터 `number1`, `number2`와 `requestCode` 값, Intent2에서  보낸 데이터 값인  `resultCode`와 `result(number1 + number2)`값이 차례대로 나오고 있다.

 

 

 

 


2. 암시적 인텐트

  • Uri를 호출할 수있는 대상에게 인텐트를 요청한다.
  • 예를들어, 웹 주소를 열 수 있는 브라우저가 여러개면 크롬, 웨일, 익스플로러 등 선택하여 화면을 띄울 수 있다.
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_intent.*

class Intent1 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intent)


        change_activity.setOnClickListener {

          
            /*** 암시적 인텐트 ***/
            // 인터넷 페이지를 열수있는 브라우저(크롬, 웨일 등)에서 열림
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"))
            startActivity(intent)

        }
    }
}

 

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

[안드로이드] RelativeLayout  (0) 2021.09.21
[안드로이드] LinearLayout  (0) 2021.09.19
[안드로이드] invisible과 gone  (0) 2021.09.18
[안드로이드] ConstraintLayout  (0) 2021.09.18
[안드로이드] drawable의 Shape  (0) 2021.09.16
글쓰기 설정