본문 바로가기
안드로이드

[android] [kotlin] intent 사용하기

by 코드 이야기 2020. 12. 22.
728x90

 

intent란 간단히 말하자면 여러 화면(창) 간의 이동을 할 수 있도록 해주는 것입니다.

자세히 (android developer)

 

예를 들어보자면

게임을 하다가 전화가 와서 전화를 받으면 전화 화면으로 바뀌는 상황 (app <-> android system)

주문을 하기위해 결제화면이 뜨는 상황 (app <-> app)

 

 

main화면과 sub화면간의 이동을 하는 프로그램을 만들어 intent를 사용하는 예시를 보겠습니다.

 

 

 

우선 main화면에 TextView와 Button을 대강 만들어 배치해줍시다.

MainActivity Xml

 

 

main화면을 만들었으니 Sub 화면도 만들어줍시다.

Activity Name을 설정해준 후 finish를 눌러 만들기 완성!

 

 

Sub화면에도 대충 텍스트 하나 만들어줍시다.

SubActivity Xml

 

 

자! 이제 화면을 만들어주었으니 intent를 사용하러 가봅시다!

 

MainActivity kt

package com.example.intentex1

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

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

        btn_intent.setOnClickListener{
            val intent = Intent(this, SubActivity::class.java)  // 인텐트를 생성해줌, 
            // or val intent = Intent(this@MainActivity, SubActivity::class.java)
            //자기자신 클래스의 정보와 띄워줄 화면의 정보를 적어준다.
            intent.putExtra("msg", text_main.text.toString())  
            // (key, value) 전달할 정보가 없다면 이 문장을 사용하지 않아도 됨.
            // 전달할 정보가 많다면 더 적어줄 수도 있다.
            startActivity(intent)  // 화면 전환을 시켜줌
            finish()  // main 창을 닫아줌. 닫아주지 않고싶다면 이 문장을 사용하지 않아도 됨.
        }
    }
}

위의 방법이나 아래의 방법을 사용한다.

가독성을 위해 apply를 사용하기도 한다. intent에 어떤 작업을 했는지 한눈에 볼 수 있음.

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

        btn_intent.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)
            intent.apply {
                this.putExtra("msg", text_main.text.toString())
            }
            startActivity(intent)
        }
    }
}

 

SubActivity kt

package com.example.intentex1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_sub.*

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

        if(intent.hasExtra("msg")) {  //msg라는 키값을 가진 intent가 정보를 가지고 있다면 실행
            text_sub.text = intent.getStringExtra("msg")  
            // text_sub의 문구를 msg라는 키값을 가진 intent의 정보로 바꾸어준다.
        }

    }
}​

 

 

만약 메인화면의 버튼을 눌렀을 때 앱이 종료된다면 Menifest에 SubActivity를 추가시켜줄 것..!

 

 

 

 

 

+ 암시적 인텐트

앞서 본 것은 명시적으로 인텐트를 하는 방법이었습니다.

아래에 있는 방법은 암시적으로 인텐트를 하는 방법입니다.

btn_intent.setOnClickListener {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.naver.com/"))
    //ACTION_VIEW = 뒤에 있는 것을 보여주라는 뜻
    startActivity(intent)
}

 

딱 보면 알 수 있듯이 네이버를 띄워줄 수 있습니다만 명시적과 암시적 인텐트는 어떤 차이가 있는걸까요?

 

  • 명시적 인텐트는 정확한 대상에게 요청한다.
  • 암시적 인텐트는 작업을 할 수 있는 대상 모두에게 요청한다.
    (링크 클릭시, 링크를 열 수 있는 앱이 많은 경우. 크롬, 웨일, 인스타 등에게 요청)
    ex. 갤러리에서 사진을 골라 공유를 한다면 카톡, 문자, 이메일 등에서 선택하는 것처럼 대상이 여럿 있을 수 있는 것들.

 

 

 

 

 

 

728x90

댓글