Android

(Android Studio) Activity, Intent

돗개진 2024. 3. 22. 17:56

[ 안드로이드 4대 컴포넌트 ]

4대 컴포넌트를 이해하고 안드로이드 애플리케이션 기본 구조 파악이 매우 중요

 

1. 액티비티 (Activity)

- 사용자가 직접 상호작용하는 화면

-> 사용자 인터페이스(UI)를 담당하며, 사용자의 입력에 반응하는 이벤트 기반 프로그래밍 가능

 

2. 서비스 (Service)

- 백그라운드에서 오랜 시간 동안 실행되어야 하는 작업 수행 (ex: 음악 재생, 파일 다운로드 등)

-> 사용자가 직접적으로 인지하지 못하는 애플리케이션의 백스테이지에서 일어나는 작업들을 담당

 

3 브로드캐스트 리시버 (Broadcast Receiver)

- 안드로이드 시스템으로부터 발송되는 다양한 이벤트나 정보를 앱이 받을 수 있게 해 주는 컴포넌트 (ex: 배터리 부족 경고, 화면 꺼짐 등)

-> 애플리케이션은 브로드캐스트 메시지를 구독하고 해당 이벤트가 발생했을 때 반응 가능

 

4. 콘텐트 프로바이더 (Content Provider)

- 애플리케이션 간의 데이터 공유 가능 (ex: 연락처 애플리케이션이 다른 애플리케이션에게 연락처 데이터 제공)

-> 데이터를 저장하고 관리하는 일종의 데이터베이스 역할을 하며 다른 애플리케이션에 안전하게 데이터 공유

 


 

[ Activity ]

- 안드로이드 애플리케이션의 핵심 구성 요소이며 사용자가 직접 상호 작용을 하는 창(window)를 의미, 각 액티비티는 독립적인 화면이며 사용자에게 다양한 작업을 수행할 수 있는 인터페이스를 제공함

 

- UI 구성

: 각 액티비티는 하나의 창을 가지며 이 창에는 뷰(View)라 불리는 객체들을 통해 사용자 인터페이스를 구성함. 뷰 객체들은 버튼, 텍스트 필드, 이미지 등 사용자가 볼 수 있는 요소를 포함함.

 

- Android Manifest

: 모든 Activity 컴포넌트는 Android Manifest 파일에 등록되어야 함

<manifest>
	<appplication>
    	<activity android:name = ".FirstActivity"
        	android:label = "First Activity">
        </activity>
	</application>
</manifest>

-> AndroidManifest.xml 파일은 안드로이드 애플리케이션의 심장부이며 애플리케이션의 기본 구조를 정의하고 시스템이 이 앱을 어떻게 실행해야 하는지 알려주는 중요한 지시사항을 담고 있음

 

Android Manifest의 역할

- 패키지 이름 설정

: 앱의 고유 식별자로서 애플리케이션의 패키지 이름 설정, Goolgle Play와 같은 앱 스토어에서 앱을 구별하는 데 사용

- 구성 요소 선언

: 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더와 같은 애플리케이션 구성 요소들의 존재를 시스템에 알림

- 권한 설정

: 앱이 사용자의 기기에서 특정 작업을 수행하기 위해 필요한 권한을 명시함, 다른 앱이 이 앱과 상호 작용을 하기 위해 필요한 권한도 설정 가능

 


 

[ Intent ]

- 일종의 메시지 객체, intent를 통해서 다른 앱 구성요소(액티비티, 서비스, 브로드캐스트 리시버)로 작업 요청 가능

intetn를 통해 Acticity A 에서 Activity B, Service, Broadcast Receiver 등으로 여러 요소로 데이터를 전달함

 

 

1) 명시적 인텐트 (Explict Intent)

특정한 컴포넌트를 직접적으로 호출할 때 사용되는 인텐트. 개발자는 인텐트 객체에 시작하고자 하는 구성 요소의 이름을 명확하게 설정하여 startActivity() / startService() 메소드를 통해 해당 컴포넌트 실행 가능

ex) 앱 내부에서 다른 액티비티나 서비스를 시작할 때 사용됨 (메인 액티비티에서 사용자에게 받은 정보를 다른 액티비티 띄울 때 사용)

// 현재 액티비티에서 AnotherActivity를 시작하기 위한 명시적 인텐트 생성
val intent = Intent(this, AnotherActivity::class.java)

// 인텐트에 데이터 추가 (옵션)
intent.putExtra("key", "value")

// AnotherActivity 시작
startActivity(intent)

 

 

2) 암시적 인텐트 (Implicit Intent)

: 특정한 컴포넌트를 명시하지 않고 수행하고자 하는 일반적인 작업을 인텐트 객체에 설정하여 startActivity() 메소드에 넘김. 안드로이드 시스템은 인텐트를 처리할 수 있는 모든 앱을 검색하여 적합한 인텐트 필터를 가진 컴포넌트를 찾아 실행함

ㄴ> 작업을 실행할 때 사용할 애플리케이션을 선택하는 창에서 '작업'에 해당하는 인텐트를 처리할 수 있는 컴포넌트들을 모아서 사용자에게 보여 줌

 

// Create the text message with a string
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, textMessage)
    type = "text/plain"
}

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(packageManager) != null) {
    startActivity(sendIntent)
}

ㄴ> 암시적 인텐트 예시 코드이다 암시적 인텐트는 해당 인텐트가 어떤 기능을 수행할 수 있을지 ACTION을 통해서 선언된다. ex) Intent.ACTION_VIEW = 사용자에게 데이터를 보여 줄 때 / Intent.ACTION_DIAL = 전화 다이얼을 열어야 할 때

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activityintent">

    <application
        ...>
        <activity android:name=".ThirdActivity"></activity>

        <activity android:name=".SecondActivity"
            android:label="Second Activity">

            <!--추가된 인텐트 필터 시작-->
            <intent-filter>
                <action android:name="android.intent.action.DIAL" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="tel" />
            </intent-filter>
            <!--추가된 인텐트 필터 끝-->

        </activity>

        <activity android:name=".FirstActivity">
            ...
        </activity>
    </application>

</manifest>

ㄴ> 본인의 앱이 수신할 수 있는 암시적 인텐트가 어느 것인지 알리려면 각 앱 구성 요소에 대한 하나 이상의 인텐트 필터를 <intent-filter> 요소로 매니페스트 파일에 선언함. 각 인텐트 필터가 인텐트의 작업, 데이터 및 카테고리를 근거로 어느 유형의 인텐트를 수신할지 결정함.


[ Intent 객체 분석하기 ]

 

1). 컴포넌트 이름 (Component Name)

  • 타겟 컴포넌트의 이름을 명시하여, 인텐트가 전달될 정확한 대상을 지정합니다.
  • 예: new Intent(context, TargetActivity.class)에서 TargetActivity.class가 컴포넌트 이름입니다.
  • 컴포넌트 이름이 없으면, 인텐트는 암시적으로 처리되고, 시스템이 적절한 대상을 찾습니다.

2). 액션 (Action)

  • 인텐트가 수행해야 할 일반적인 작업을 정의합니다.
  • 예: Intent.ACTION_VIEW는 사용자에게 데이터를 보여줄 때 사용됩니다.
  • 예: Intent.ACTION_DIAL은 전화 다이얼을 열기 위해 사용됩니다.

3). 데이터 (Data)

  • 작업을 수행하는 데 필요한 데이터의 URI를 지정합니다.
  • 예: Uri.parse("tel:12345")는 전화 앱에 전화번호 데이터를 제공합니다.
  • 데이터는 보통 Uri 객체로 액션과 결합하여 사용됩니다.

4). 카테고리 (Category)

  • 인텐트의 유형을 더 구체적으로 지정하여, 어떤 컴포넌트가 처리할 수 있는지 알려줍니다.
  • 예: Intent.CATEGORY_HOME은 홈 화면 애플리케이션을 시작할 때 사용됩니다.

5). 엑스트라 (Extras)

  • 복잡한 데이터를 인텐트에 전달하기 위한 키-값 쌍의 추가 정보입니다.
  • 예: intent.putExtra("extra_key", "value")에서 "extra_key"는 전달할 데이터의 키이며, "value"는 실제 값입니다.
  • 엑스트라를 통해 기본 타입부터 Serializable 객체까지 다양한 데이터를 전달할 수 있습니다.

 


 

[ Extras 에 값을 저장하는 메소드 ]

  • Intent putExtra(String name, int value)
  • Intent putExtra(String name, String value)
  • Intent putExtra(String name, boolean value)

 

[ Extras에 저장된 값을 읽어 오는 메소드 ]

  • int getIntExtra(String name, int defaultValue)
  • String getStringExtra(String name)
  • boolean getBooleanExtra(String name, boolean defaultValue)