질문 정리

안드로이드 4대 컴포넌트와 Intent

five2week 2023. 3. 20. 01:10

이번에 브로드캐스트 리시버와 서비스에 대해서 배웠기 때문에 복습 겸 정리를 합니다.

 

안드로이드 4대 컴포넌트는 앱의 기본 구성 요소로, 앱의 구조와 작동 방식을 결정합니다.

각 컴포넌트는 고유한 역할을 수행하며, 시스템 및 다른 앱과 상호 작용하는 방법을 정의합니다. 

 

1. Activity

액티비티는 사용자 인터페이스(UI)를 가지는 화면입니다. 사용자와 상호 작용하는 앱의 주요 구성 요소입니다. 일반적으로 하나의 액티비티는 하나의 화면을 나타내며, 사용자가 앱 내에서 이동하면 여러 개의 액티비티가 차례로 실행됩니다.

 

 

2. Service

서비스는 백그라운드에서 실행되는 구성 요소로, 사용자 인터페이스(UI)가 없습니다. 오랫동안 실행되어야 하는 작업이나 백그라운드 작업에 사용됩니다. 예를 들어, 음악 플레이어 앱에서 음악을 재생하는 기능은 서비스를 통해 구현될 수 있으며, 사용자가 다른 앱을 사용하는 동안에도 계속 음악이 재생됩니다. 그리고 파일 다운로드, 위치 정보 추적, 데이터 동기화 등의 작업을 모두 서비스로 구현할 있습니다.

 

서비스에는 두 가지 주요 유형이 있습니다.

- Stared Service(시작 서비스): 시작 서비스는 앱에서 명시적으로 시작되며, 앱과 독립적으로 실행됩니다. 시작 서비스는 일반적으로 오랫동안 실행되어야 하는 작업에 사용됩니다. 시작 서비스는 작업이 완료되면 자동으로 중지되어야 합니다.

- Bound Service(바인드 서비스): 바인드 서비스는 다은 앱 구성 요소에 바인딩되어 실행됩니다. 주로 다른 앱 구성 요소와 상호 작용 하는 작업에 사용됩니다. 바인드 서비스는 모든 구성 요소와의 연결이 끊어지면 자동으로 중지됩니다.

 

 

3. Broadcast Receiver

브로드 캐스트 리시버는 시스템이나 다른 앱에서 보내는 브로드캐스트 메세지를 수신하는 구성 요소입니다. 예를 들어, 배터리 부족 경고, 네트워크 상태 변경 등과 같은 시스템 이벤트를 감지할 수 있습니다. 또한 사용자가 정의해서 브로드 캐스트 메세지를 보낼 수도 있습니다. 일반적으로 백그라운드에서 실행되며, 메세지를 받으면 지정된 작업을 수행합니다. 

저의 경우에는 저장된 메모의 데이터가 업데이트 될 때, 그 메모를 띄우고 있는 위젯에 브로드캐스트 메세지를 보내고, 그 메세지를 브로드캐스트 리시버로 받아서 처리한 적이 있습니다.

 

등록하는 방법으로는 두가지가 있습니다.

- AndroidManifest.xml 파일에 등록하는 방법: 앱의 설치되고, 시스템이 부팅될 때 등록되는 방법입니다. 앱이 실행되지 않아도 작동합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    ...
    <application>
        ...
        <receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.MY_ACTION" />
            </intent-filter>
        </receiver>
    </application>
</manifest>
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Broadcast received", Toast.LENGTH_SHORT).show();
    }
}

동적으로 등록하는 두 가지 방법: 앱이 실행 중인 동안에만 리시버가 등록되어 동작합니다. 앱이 종료되면 등록이 해제됩니다.

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private MyBroadcastReceiver myBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myBroadcastReceiver = new MyBroadcastReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter("com.example.MY_ACTION");
        registerReceiver(myBroadcastReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(myBroadcastReceiver);
    }

    private class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Broadcast received", Toast.LENGTH_SHORT).show();
        }
    }
}

 

4. Content Provider

콘텐츠 프로바이더는 앱 간의 데이터를 공유하는데 사용되는 구성 요소입니다. 콘텐츠 프로바이더를 사용하면, 다른 앱에서 현재 앱의 데이터를 읽고 쓸 수 있습니다. 예를 들어, 주소록 앱의 데이터를 다른 앱이 사용하려면 콘텐츠 프로바이더를 통해 접근할 수 있습니다.

 

 

Intent

인텐트는 안드로이드 시스템에서 컴포넌트 간에 통신을 위해서 사용되는 메세징 객체입니다. 인텐트를 사용하면 액티비티, 서비스, 브로드캐스트 리시버와 같은 컴포넌트를 시작하거나, 데이터를 전달하고 결과를 수신할 수 있습니다.

인텐트는 크게 두가지 경우로 구분할 수 있습니다.

 

- Explicit Intent(명시적 인텐트): 명시적 인텐트는 대상 컴포넌트의 정확한 클래스 이름을 지정하여 사용됩니다. 이를 통해 개발자는 특정 컴포넌트를 시작하거나 통신할 수 있습니다. 예를 들어 액티비티에서 액티비티로 이동할 때, 명시적 인텐트 방식을 사용할 수 있습니다.

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

- Implicit Intent(암시적 인텐트): 암시적 인텐트는 특정 작업을 수행할 수 있는 컴포넌트를 시스템에 요청합니다. 암시적 인텐트는 대상 컴포넌트의 클래스 이름을 지정하지 않고, 대신 수행할 action과 data를 지정합니다. 시스템은 이 정보를 바탕으로 적절한 컴포넌트를 찾아서 실행합니다.  예를 들어, 웹 브라우저를 사용하여 URL을 여는 경우 암시적 인텐트를 사용할 수 있습니다.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.example.com"));
startActivity(intent);

인텐트를 통해서 데이터를 전달하기도 하며, 앱 컴포넌트 간의 통신 및 상호작용을 가능하게 합니다.

 

참고링크

https://developer.android.com/guide/components/intents-filters?hl=ko 

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

https://developer.android.com/guide/components/activities

 

활동 소개  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com

https://developer.android.com/guide/components/services

 

서비스 개요  |  Android 개발자  |  Android Developers

서비스 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Service는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이며 사

developer.android.com

https://developer.android.com/guide/components/broadcasts

 

브로드캐스트 개요  |  Android 개발자  |  Android Developers

브로드캐스트 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 앱은 Android 시스템 및 기타 Android 앱에서 게시-구독 디자인 패턴과 유사한 브로드캐

developer.android.com

https://developer.android.com/guide/topics/providers/content-providers

 

콘텐츠 제공자  |  Android 개발자  |  Android Developers

Content providers manage access to a structured set of data. They encapsulate the data, and provide mechanisms for defining data security. Content providers are the standard interface that connects data in one process with code running in another process

developer.android.com