Programming/Android

[Android Roadmap] Part2: App Components

코딩뽀시래기 2023. 1. 31. 17:52
728x90

 

📌 Part2: App Components

 

The 2022 Android Developer Roadmap - Part 2

The 2022 Android Developer Roadmap (part 2) focuses on App Components, Intents, and App Entry Points. Start learning Android today!

getstream.io


 

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