Android 4대 컴포넌트

울늘·2024년 3월 14일
0

기술 질문

목록 보기
1/2

Android 4대 컴포넌트란 Android 앱의 필수 구성요소입니다.
각 구성요소는 시스템이나 사용자가 앱에 진입할 수 있는 진입점이며, 일부 구성요소는 다른 구성요소에 종속됩니다.

앱 구성요소에는 네 가지 유형이 있으며 이를 Android 4대 컴포넌트라 부릅니다.

  • Activity
  • Service
  • Broadcast receiver
  • Content provider

특징

  • 각 컴포넌트는 독립적으로 존재한다.
  • 각 컴포넌트는 고유의 기능을 수행한다.
  • 각 컴포넌트는 인텐트를 통해서 서로 상호작용한다.

Activity(액티비티)

activity는 사용자와 상호작용하는 진입점입니다. 사용자 인터페이스가 있는 단일 화면을 나타냅니다.
예를 들어 이메일 앱에는 사용자에게 새 이메일을 보여주는 화면, 이메일을 작성하는 화면, 이메일을 읽는 화면이 있을 수 있습니다.
이처럼 여러 화면이 작동해서 이메일 앱에서 일관된 사용자 환경을 형성하지만 각 화면은 독립적입니다.
  • Activity는 사용자가 Application과 상호작용하며 실제로 사용자에게 보이는 화면을 의미한다.
  • Activity는 인텐트(Intent)를 통해 다른 Application의 액티비티를 호출할 수 있다.
  • 2개 이상의 Activity를 동시에 화면에 보여줄 수 없다.
  • 1개 이상의 View 또는 ViewGroup을 포함한다.
  • Application에는 하나 이상의 Activity가 있어야 한다.

액티비티의 주요 작용

  • Activity는 사용자의 화면을 추적하여 시스템이 Activity를 호스팅하는 프로세스를 계속 실행하도록 한다.

  • 중지된 활동이 포함된 이전에 사용된 프로세스를 파악하고 이러한 프로세스의 우선순위를 더 높여 프로세스의 가용성을 유지한다.

  • 프로세스 종료를 처리하도록 지원하여 사용자가 이전 상태가 복원된 활동으로 돌아갈 수 있도록 한다.

  • 앱이 서로 사용자 흐름을 구현하고 시스템에서 이러한 흐름을 조정할 수 있는 방법을 제공한다. 이에 대한 주된 예시는 공유하기이다.

Service(서비스)

서비스는 여러 가지 이유로 앱을 백그라운드에서 계속 실행하기 위한 범용 진입점입니다.
장기 실행 작업을 실행하거나 원격 프로세스의 작업을 실행하기 위해 백그라운드에서 실행되는 구성요소입니다.
서비스는 사용자 인터페이스를 제공하지 않습니다.
예를 들어 백그라운드에서 음악을 재생하거나 사용자와 액티비티의 상호작용을 차단하지 않고 네트워크를 통해 데이터를 가져올 수 있습니다.
다른 컴포넌트들은 시작된 서비스(Started services)를 사용하거나 바인드된 서비스(Bound services)를 사용하여 Service와 상호작용할 수 있습니다.
  • Application이 종료되어도 BackGround에서 동작하는 컴포넌트이다.
  • 시작된 서비스(Started services)인 포그라운드 서비스, 백그라운드 서비스와 바인드된 서비스인 바인드 서비스로 나뉜다.
  • 네트워크와 연동이 가능하다.
  • Activity와 Service는 Ui스레드라고 불리는 동일한 애플리케이션 스레드로 실행된다.

서비스 종류

  • 포그라운드 서비스
    포그라운드 서비스는 중간에 사라지면 사용자의 경험이 저하되기 때문에 시스템은 포그라운드에 프로세스가 실행되고 있을 때 이 프로세스를 실행 상태로 유지하는 것을 우선시 한다. 예를 들어 음악을 재생하고 있음을 알리는 알림이 있다. 포그라운드 서비스는 앱이 종료되어도 상태를 유지할 수 있도록 한다.

  • 백그라운드 서비스
    백그라운드 서비스는 사용자가 직접 인식할 수 있는 것이 아니므로 시스템은 프로세스를 더 자유롭게 관리할 수 있습니다. 예제로는 앱이 실행되는 동안 처리되는 백그라운드 서비스 전체이다.
    앱이 종료되면 백그라운드 서비스는 API26 버전 이후로는 종료된다.

  • 바인드 서비스
    바인드 서비스는 일부 다른앱(또는 시스템)이 서비스를 사용하고 싶다고 요청했기 때문에 실행됩니다. 바인드 서비스는 클라이언트-서버 인터페이스를 제공해 서비스와 상호 작용한다. 여러개가 한꺼번에 바인딩 될 수 있고, 바인딩 된 컴포넌트가 모두 종료되면, 서비스도 종료된다.
    다수의 액티비티에서 하나의 서비스에 지속적으로 접근해야할 작업이 있을 시에는 BindService를 이용하시면 됩니다. 예를 들어 처음 액티비티에서 서비스를 실행하고 서비스에 포함된 객체 num을 0으로 선언하고 +1을 하고나서 다른 액티비티에서 서비스를 실행하고 num값을 확인해보면 num값은 1로 유지되어있다. 또한 이 값을 다른 패키지에서 요청하면 값을 보내줄 수도 있다. 모든 액티비티가 종료되면 바인드 서비스도 종료된다.

Broadcast Receiver

Broadcast Receiver는 간단하게 이벤트에는 화면이 켜지거나 꺼지는 것, 배터리 상태 변경, 시간 변경, 기기 부팅 완료, SMS 수신 등이 포함된다. 이 방송은 Intent를 통해 발송하게 되고, 이렇게 발송된 방송은 Broadcast Receiver 객체가 수신하여 사용한다.

public class BatteryReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 배터리 상태가 변경될 때마다 호출됩니다.
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
        
        if (isCharging) {
            // 배터리가 충전 중인 경우
            Toast.makeText(context, "배터리가 충전 중입니다.", Toast.LENGTH_SHORT).show();
        } else {
            // 배터리가 충전 중이 아닌 경우
            Toast.makeText(context, "배터리가 충전 중이 아닙니다.", Toast.LENGTH_SHORT).show();
        }
    }
}

이런식으로 사용할 수 있다.

Content Provider

Content Provider(콘텐츠 제공자)는 애플리케이션 간 데이터 공유를 위한 중요한 메커니즘 중 하나다. Content Provider를 사용하면 앱은 데이터를 다른 앱과 공유할 수 있다. 이것은 주로 데이터베이스, 파일 또는 네트워크 리소스와 같은 구조화된 데이터에 대해 사용된다.

Content Provider의 주요 기능은 다음과 같다:

데이터 공유: Content Provider는 데이터베이스, 파일 또는 기타 형식의 데이터를 다른 앱에 제공할 수 있다. 이를 통해 여러 앱이 동일한 데이터에 접근하고 수정할 수 있다.

데이터 보안: Content Provider를 통해 데이터에 대한 액세스 권한을 제어할 수 있다. 이를 통해 앱은 자신의 데이터를 안전하게 보호할 수 있다.

표준화된 인터페이스: Content Provider는 표준화된 인터페이스를 제공하여 다른 앱이 데이터에 접근할 때 일관된 방식으로 작동할 수 있도록 한다.

예를 들어 갤러리에 접근해서 이미지를 가져오려면

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

우선 매니페스트에 권한을 요청한다.

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.widget.ImageView;
import android.widget.Toast;
import com.bumptech.glide.Glide;

public class GalleryHelper {

    public static void loadGalleryImage(Context context, ImageView imageView) {
        // 갤러리 이미지를 가져오기 위한 URI
        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

        // 가져올 컬럼
        String[] projection = {MediaStore.Images.Media._ID};

        // Content Resolver를 사용하여 쿼리 수행
        Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);

        if (cursor != null && cursor.moveToFirst()) {
            // 첫 번째 이미지의 ID를 가져옴
            int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
            long imageId = cursor.getLong(columnIndex);

            // 이미지 URI 생성
            Uri imageUri = Uri.withAppendedPath(uri, String.valueOf(imageId));

            // Glide나 Picasso와 같은 이미지 로딩 라이브러리를 사용하여 이미지 로드
            Glide.with(context).load(imageUri).into(imageView);

            cursor.close();
        } else {
            // 갤러리에 이미지가 없을 때 사용자에게 알림
            Toast.makeText(context, "갤러리에 이미지가 없습니다.", Toast.LENGTH_SHORT).show();
        }
    }
}

이후에 갤러리 이미지를 가져와서 데이터를 활용할 수 있다.

브로드캐스트 리시버
어플리케이션 기본 항목
서비스 사용 이해를 위한 예제

profile
주니어 안드로이드 개발자입니다!

0개의 댓글