[ 안드로이드 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를 통해서 다른 앱 구성요소(액티비티, 서비스, 브로드캐스트 리시버)로 작업 요청 가능
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)
'Android' 카테고리의 다른 글
(Android) - Activity Stack (1) | 2024.03.27 |
---|---|
(Android Studio) - Activity 생명 주기 (0) | 2024.03.25 |
(Android Studio) - margin, padding, gravity 등 (0) | 2024.03.20 |
(Android Studio) - 레이아웃 종류와 쓰임새 (0) | 2024.03.19 |
(Android Studio) 프로젝트 구조 (1) | 2024.03.18 |