안드로이드 공부/ Intent

yellow·2021년 5월 26일
0

안드로이드 공부

목록 보기
11/28

Intent

📎 안드로이드 어플리케이션의 구성요소

1. 액티비티

  • 사용자와 상호작용을 하기 위해 뷰를 이용하여 화면을 나타낸 것

2. 서비스

  • 눈에 보여지는 UI를 가지지 않고 백그라운드(background)에서 실행되는 컴포넌트로서, 사용자가 다른 작업을 하는 중에도 백그라운드에서 음악을 재생하거나 데이터를 처리하는 등의 작업을 수행한다.

3. 브로드캐스트 수신자

  • 시스템의 공지내용을 수신하고 응답하는 역할을 수행한다.
  • 예1) 단말에 메세지가 도착했을 때 그 메세지를 받을 앱이 받도록 던지는 것을 '브로드캐스팅'이라고 하고, 그 던져진 것을 받아서 처리해주는 것이 브로드캐스트 수신자이다.
  • 예2) 배터리 부족, 사진 촬영, 언어설정 변경 등의 정보를 시스템으로부터 수신할 수 있다.

4. 내용 제공자

  • 데이터를 단말에서 가져올 수 있게 해준다.
    (그냥 가져오려면 보안 문제 때문에 가져올 수 없다.)

📎 Intent란?

  • 어플리케이션의 핵심 컴포넌트(액티비티, 서비스, 브로드캐스트 수신자)를 호출하거나, 컴포넌트 간의 상호연결을 도와주고 정보를 주고받을 수 있는 도구
  • 간단하게는, 시스템이 알아들을 수 있는 요구, 요청 포맷

인텐트가 사용되는 관계

  1. Activity <-> Activity
  2. Android System과 내 App (예: 내 앱에서 전화로 연결)
  3. 다른 App과 내 App (앱끼리 서로 연동)

요청의 종류

  1. 전달만 하는 요청
  2. 리턴을 받는 요청

인텐트의 종류

  1. 명시적 인텐트(Explicit Intent)
    - 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우
  2. 암시적 인텐트
    - 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우
    - 예시) Activity를 딱 지정한 것이 아닌, HTTP 또는 TEL을 넣어주면 그에 맞는 앱을 찾아서 띄워줌

📎 명시적 인텐트를 사용하는 예시

🖇 화면 전환

액티비티 Intent1에서 버튼을 누르면 액티비티 Intent2로 전환되는 것을 구현

1.정보 전달 없이 화면 전환

요청 만들기

Intent(this@현재Activity명, 이동 대상 Activity명::java.class)
package com.example.myapplication

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

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

        val button:Button = findViewById(R.id.change_activity)
        button.setOnClickListener {
            // 요청을 만듦
            val intent = Intent(this@Intent1, Intent2::class.java)
            // 요청을 전달
            startActivity(intent)

        }
    }
}

2. 인텐트에 정보를 담아서 화면 전환

정보 담기 (Intent1에서)

intent.putExtra(NAME, VALUE)

정보 꺼내기 (Intent2에서)

  • NullSafety를 위해 디폴트값을 같이 넣어주는 거 잊지 말자.
// 자료형을 명시해줘야 한다.
intent.getIntExtra(NAME, DEFAULT_VALUE)
intent.getStringExtra(NAME, DEFAULT_VALUE)
  • Intent1
package com.example.myapplication

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

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

        val button:Button = findViewById(R.id.change_activity)
        button.setOnClickListener {
            val intent = Intent(this@Intent1, Intent2::class.java)

            // Intent에 정보 담아 보내기
            // Key, Value 방식 -> Key와 Value를 쌍으로 만들어 저장한다. -> Dictionary
            intent.putExtra("number1", 1)
            intent.putExtra("number2", 2)
            startActivity(intent)
        }
    }
}
  • Intent2
package com.example.myapplication

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

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

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

더 가독성 높은 코드

  • apply를 사용해서 intent에서 어떤 작업을 했는지 한눈에 알아볼 수 있게 한다.
val intent = Intent(this@Intent1, Intent2::class.java)
intent.apply {
         this.putExtra("number1", 1)
         this.putExtra("number2", 2)
}
startActivity(intent)

3. 보낸 요청에 대한 응답을 받아야할 때

Activity 끼리 정보를 주고받는 경우

요청을 보내는 Activity에서는 startActivity(intent)대신

startActivityForResult(intent, 요청코드)

  - 여기서 요청코드는 여러 요청들중 하나를 구분하기 위해 사용

응답을 보내는 Activity에서 응답 설정하기

setResult(결과코드, 응답정보 인텐트)

  - 여기서 결과코드는 Activity 클래스에 선언되어있는 상수값이다.
  - RESULT_OK :수행한 작업이 성공적일때 일반적으로 쓰는 코드
  - RESULT_CANCELED : 수행한 작업이 실패일때 일반적으로 쓰는 코드

응답을 보내는 Activity에서 응답 받기

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
}
  • 응답이 도착하면 자동으로 호출되는 함수이다.
  • 응답 정보를 처리하는 코드를 이 함수 안에 작성하면 된다.
  • Intent1
package com.example.myapplication

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

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

        val button:Button = findViewById(R.id.change_activity)
        button.setOnClickListener {

            val intent = Intent(this@Intent1, Intent2::class.java)
            intent.apply {
                this.putExtra("number1", 1)
                this.putExtra("number2", 2)
            }

           // 결과값을 받아야 하는 요청
           startActivityForResult(intent, 200)
        }
    }

    // 결과값이 도착하면 자동으로 호출되는 함수
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        // 내가 보낸 요청이 맞는지 확인하는 과정
        if(requestCode == 200){
            Log.d("number",""+requestCode)
            Log.d("number",""+resultCode)

            // 응답 정보 확인하기
            val result = data?.getIntExtra("result",0)
            Log.d("number",""+result)
        }
        super.onActivityResult(requestCode, resultCode, data)
    }
}
  • Intent2
package com.example.myapplication

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

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

        val button: Button = findViewById(R.id.result)
        button.setOnClickListener {
            val number1 = intent.getIntExtra("number1", 0)
            val number2 = intent.getIntExtra("number2",0)

            // 인텐트로 전달받은 정보들 처리
            val result = number1 + number2

            // 인텐트 새로 생성
            val resultIntent = Intent()
            
            // 인텐트에 응답 정보 넣기
            resultIntent.putExtra("result", result)

            // 결과를 설정해줌
            setResult(Activity.RESULT_OK, resultIntent)

            // 액티비티 종료
            // 동시에 결과를 보냄
            finish()
        }
    }
}

📎 암시적 인텐트를 사용하는 예시

🖇 특정한 인터넷 페이지를 열도록 하기

Intent(액션, Uri.parse("열고싶은 페이지 url"))
package com.example.myapplication

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

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

        val button:Button = findViewById(R.id.change_activity)
        button.setOnClickListener {
            // 특정한 인터넷 페이지를 열도록
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"))
            startActivity(intent)
        }
    }
}
profile
할 수 있어! :)

0개의 댓글

관련 채용 정보