728x90
📌 Part2: App Components
1️⃣ App Components
- Android 개발에서의 앱 컴포넌트: 안드로이드 시스템 및 사용자 애플리케이션과 상호작용 할 수 있도록 하는 entry point(진입점)
- 각 컴포넌트는 생성 및 소멸 방법을 결정하는 고유한 기능과 수명 주기가 있음.
🔴 Activities
- UI 관련 리소스를 제공하여 사용자와 상호 작용하는 요소
- 독립적이고 재사용 가능한 구성 요소
- 모든 Android 애플리케이션에는 Activity가 최소 하나 이상 존재해야 함.
Activity Lifecycles
- 모든 Activity는 고유한 생명 주기가 있음
- Activity 및 리소스 관리에 중요한 개념
- Activity 클래스는 수명 주기 상태가 변경되었음을 Acitivity에 알리는 주요한 메서드를 제공
- onCreate()
- 시스템이 Activity를 생성할 때 호출
- 단 한 번만 발생해야 하는 대부분의 초기화 로직은 여기에서 처리되어야 함.
- 예) View 초기화, 데이터 바인딩
- onStart()
- onCreate() 메서드를 호출한 후, Activity가 사용자에게 보여질 때 호출됨.
- 여러 개의 Activity 또는 애플리케이션 간에 화면을 전환하는 경우 이 콜백 함수는 두 번 이상 호출될 수 있음
- onResume()
- Activity가 foreground로 노출되어 사용자와 상호 작용할 준비가 되었음을 의미
- onPause()
- Activity가 더 이상 사용자에게 보여지고 있지 않지만, 여전히 부분적으로 보여질 수 있음을 의미
- 예) 사용자가 멀티 윈도우 모드에 있는 경우
- 대부분의 경우, 사용자가 Activity를 떠나고 생명 주기가 다음 상태로 전환됨을 나타냄
- onStop()
- Activity가 사용자에게 더 이상 보여지지 않을 때 호출
- 여러 Activity 또는 애플리케이션 간에 전환되는 경우 이 콜백 함수는 두 번 이상 호출될 수 있음
- onDestroy()
- Activity가 완전히 파괴되기 전에 호출
- Activity가 종료되거나 화면전환으로 인해 시스템이 Activity를 일시적으로 파괴할 때 이 콜백을 호출
- 남은 모든 리소스를 해체하고 Garbage Collector가 할당된 모든 메모리를 회수하도록 할 때 사용 가능
✅ onResume()/onPause()와 onStart()/onStop()
- onPause() 함수는 Activity 위에 다른 Activity가 올라오는 등 focus를 잃은 상황에 불리고, onResume() 함수는 focus를 다시 얻었을 때 불림.
- onStop() 함수는 Activity가 완전히 화면을 벗어날 때(홈 키를 눌러 홈화면으로 이동하는 등) 불리고, onStart() 함수는 Activity 화면이 다시 돌아올 때 불림.
- onStart()/onStop(): 자신의 Activity 위에 다른 Activity가 올라왔는데 화면을 전부 채우지 않았을 떄, 작업을 계속하고 싶은 경우 사용
- onResume()/onPause(): Activity가 focus를 잃으면 무조건 작업을 종료해야 하는 경우 사용
Activity 생성하기
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
- 앱에서 생성한 Activity를 사용하기 위해서는 반드시 App Manifest에 정의
<manifest ... >
<application ... >
<activity android:name=".MainActivity" />
...
</application ... >
...
</manifest >
🟡 Services
- 원격 프로세스에 대한 기능을 수행하고 백그라운드에서 음악 플레이어 또는 Youtube 비디오 플레이어와 같이 장기적으로 수행되는 작업을 실행하도록 설계된 entry point(진입점)
Service Lifecycles (서비스 생명 주기)
- Service에는 고유한 생명 주기가 있으며, Service 시작하고 관리하는 두 가지 유형을 제공
- startService
- 다른 컴포넌트들은 startService()를 호출하여 Service를 실행할 수 있음.
- 이 Service는 백그라운드에서 실행되며 다른 컴포넌트에서 stopService()를 호출하여 서비스를 중지할 수 있음.
- bindService
- 다른 컴포넌트나 클라이언트는 bindService()를 호출하여 Service를 실행할 수 있음.
- bindService() 함수는 클라이언트가 Service와 일관되게 통신할 수 있도록 하는 IBinder 인터페이스를 제공
- 이 Service는 백그라운드에서 실행됨.
- 다른 컴포넌트나 클라이언트도 unbindService를 호출하여 실행을 중단 가능
아래 그림에서 볼 수 있듯이 Service의 생명 주기는 생성 방법에 따라 다름.
- 위의 그림은 startService()에 의해 생성된 Service와 bindService()에 의해 생성된 Service를 구분
- Service가 시작되는 방식에 관계없이 잠재적으로 클라이언트가 Service 바인딩하도록 허용 가능
Creating a Service (서비스 생성하기)
class MyService : Service() {
private var binder: IBinder? = null
override fun onCreate() {
// The service is being created
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(
intent,
flags,
startId
) // indicates how to behave if the service is killed
}
override fun onBind(intent: Intent?): IBinder? {
// A client is binding to the service with bindService()
return binder
}
override fun onDestroy() {
// The service is no longer used and is being destroyed
}
}
<manifest ... >
<application ... >
<service android:name=".MyService" />
...
</application ... >
...
</manifest >
🟢 Broadcast Receiver (브로드캐스트 리시버)
- Broadcast receiver는 안드로이드 시스템 및 기타 안드로이드 응용 프로그램에서 broadcast 메시지를 청취하도록 등록 가능한 수신기
- 안드로이드 문서에 따르면, broadcast는 시스템이 부팅되거나 기기가 충전을 시작할 때와 같이 일반적인 시스템 변화를 앱에서 메시지 형태로 관찰하는 데 사용됨
- Broadcast receiver는 Activity나 Service와 달리 수명 주기가 없음.
- 대신, 등록이 취소될 때까지 할당된 모든 이벤트 메시지를 수신
Creating a Broadcast Receiver (브로드캐스트 리시버 만들기)
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// do something
}
}
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>
🔵 Content Providers (콘텐츠 프로바이터)
- Content Provider는 애플리케이션의 데이터에 액세스하고 다른 애플리케이션과 공유하는 기능을 제공
- Android 문서에 따르면 Content Provider는 파일 시스템, SQLite 데이터베이스, Jetpack Room 또는 웹에 저장된 모든 종류의 영구 데이터를 여러 앱 간에 공유할 수 있도록 함.
- Content Provider는 자체적인 보안 시스템이 적용
- 사용자 권한을 요구하여 내부적으로 데이터를 보호
- 요청하는 애플리케이션에 필요한 권한이 없으면 Content Provider의 데이터에 접근할 수 없음.
2️⃣ Intents (인텐트)
- 인텐트는 나중에 실행할 작업에 대한 추상적인 정의
- 예를 들어 앱 컴포넌트의 진입점을 실행하거나 Broadcast Receiver에 메시지를 보낼 수 있음
🔴 Use Cases of Intents (인텐트 사용 사례)
- Activity 실행
- 인텐트를 startActivity() 메서드에 실행하여 새 Activity를 실행 가능
- 인텐트는 Activity의 수행 동작을 정의하고 새 Activity에서 사용해야 하는 데이터를 전달
- Service 실행
- 인텐트를 startService() 메서드에 전달하여 새 Service를 실행 가능
- 인텐트는 Service의 동작을 정의하고 새로운 Service에서 사용해야 하는 데이터를 전달
- Broadcast Receiver에 메시지 전달
- sendBroadcast() 또는 sendOrderedBroadcast() 메서드에 인텐트를 전달하여 Broadcast Receiver에 메시지를 전달할 수 있음
- 다른 컴포넌트 또는 다른 앱에서 broadcast 메시지로 인텐트를 전달할 수 있음
🟡 Intent Types (인텐트 타입)
- Explicit Intents (명시적 인텐트)
- 애플리케이션의 패키지 이름 또는 컴포넌트의 클래스 이름과 같이 명시적인 정보가 포함
- 예를 들어, Activity/Service를 실행하거나 명시적 대상 클래스 또는 패키지 정보를 포함하는 인텐트를 사용하여 Broadcast Receiver에 메시지를 보낼 수 있음.
- Implicit Intents (암시적 인텐트)
- 지정된 대상 정보를 포함하지 않고 해당 동작을 대신 수행할 일반 작업을 선언
- 예를 들어 갤러리에 사용자 이미지를 표시하거나 웹 브라우저에서 URL을 열려면 암시적 인텐트를 사용하여 Android 시스템에 작업을 요청 가능
- 그런 다음 Android 시스템은 설치된 모든 애플리케이션에서 intent filters를 검색하고 적절한 컴포넌트를 비교하여 암시적 인텐트를 시작
- Android 시스템이 적절한 컴포넌트를 찾으면 사용 가능한 구성 요소 목록을 표시하지만, 그렇지 않은 경우 암시적 인텐트를 수행할 수 없음
3️⃣ App Entry Point (앱 진입점)
- Android에는 Activity와 앱 바로 가기라는 두 가지의 앱 진입점이 있음
🔴 App Shortcuts (앱 바로 가기)
- 앱 바로 가기를 사용하면 앱에서 특정 작업 실행 가능
- 앱 아이콘을 길게 누르면 바로가기가 표시되고 아래 그림과 같이 목록에서 항목을 클릭하여 작업을 시작할수 있음
- Static shortcuts (정적 바로 가기)
- 정적 바로 가기는 앱 내에서 일관된 작업에 대한 링크를 제공하고 사용자 컨텍스트에 종속되지 않는 정적 작업을 수행
- 예: 최근 메시지 표시, 게시물 작성 또는 키워드 검색
- Dynamic shortcuts (동적 바로 가기)
- 동적 바로 가기는 앱 내 사용자 컨텍스트를 기반으로 하는 특정 작업에 대한 링크를 제공
- 예: 특정 사람에게 메시지를 보내거나 특정 위치로 이동
- Pinned shortcuts (고정된 단축키)
- 고정된 단축키(Android 8.0 이상에서 지원됨)를 사용하면 지원되는 실행기에 단축키 고정 가능
- 홈 화면에서 고정된 바로 가기를 클릭하여 특정 작업 실행 가능
🟡 Creating Static Shortcuts (정적 바로 가기 생성 하기)
- 정적 바로가기를 생성하기 위해서는 res/xml/shortcuts.xml 파일을 생성해야 함
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="message"
android:enabled="true"
android:icon="@drawable/ic_message"
android:shortcutShortLabel="@string/short_label"
android:shortcutLongLabel="@string/long_label"
android:shortcutDisabledMessage="@string/message_shortcut_disabled">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.ComposeActivity" />
<categories android:name="android.shortcut.conversation" />
<capability-binding android:key="actions.intent.CREATE_MESSAGE" />
</shortcut>
</shortcuts>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.getstream.example">
<application ... >
<activity android:name="Main">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
</application>
</manifest>
728x90
'Programming > Android' 카테고리의 다른 글
[Android Roadmap] Part4: Design Patterns and Architecture (2/2) (0) | 2023.02.27 |
---|---|
[Android Roadmap] Part4: Design Patterns and Architecture (1/2) (0) | 2023.02.21 |
[Android Roadmap] Part1: The Android Platform (0) | 2023.01.24 |
[Android/Kotlin] viewBinding 세팅 (0) | 2022.10.25 |
[UMC 3rd/Android] 파파고 UI 구현 (xml) (0) | 2022.10.11 |