플랫폼/안드로이드 android

안드로이드[Android] 4대 컴포넌트 설명 / 예시

삐뚤어진 개발자 2020. 3. 31.

안드로이드 플랫폼을 처음 공부할 때, 4대 컴포넌트라는 말을 많이 들어보셨을 겁니다.

안드로이드의 4대 컴포넌트는

  • 액티비티 (Activity)
  • 서비스 (Service)
  • 콘텐트제공자 (Contents Provider)
  • 방송수신자 (BroadCast Reicever)

4가지를 말합니다.

4대 컴포넌트에 대한 이해가 있어야 안드로이드 어플리케이션을 개발할 때 모든 기능을 골고루 쓸수 있습니다.(하지만 필수는 아닙니다.)

 

아래의 그림과 같이 각각의 구성요소는 인텐트를 통해서 상호 통신을 합니다.

다시말해 액티비티에서 다른 구성요소를 호출할때는 인텐트를 거쳐야 한다는 것입니다.

(액티비티에서 다른 액티비티를 호출할 때도 마찬가지로 인텐트를 통해 호출합니다.)

 

 

 

 

4대 컴포넌트 구성요소

 

1. 액티비티 (Activity)

액티비티는 UI 화면을 담당하는 컴포넌트입니다. 액티비티 역할을 하기 위해서는 자바소스에서 Activity클래스를 상속해야 하며 액티비티가 기본적으로 가지고 있는 생명주기 메소드를 재정의하여 원하는 기능을 구현하는 방식으로 제작합니다. 가장 많이 쓰이는 컴포넌트 이기때문에 굉장히 중요하다고 볼 수 있습니다.

 

Activity(액티비티) 특징

1. 안드로이드 어플리케이션은 반드시 하나이상의 Activity를 가지고 있어야 합니다.

2. 두개의 액티비티를 동시에 호출할 수 없습니다.

(하나의 액티비티에서 프래그먼트(Fragment)로 화면을 둘 이상으로 나눌수는 있습니다.)

3. 다른 어플리케이션의 액티비티도 호출할 수 있습니다.

 

액티비티 예시

//메인 엑티비티
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //다른 엑티비티 호출
        Context mContext = MainActivity.this;
        Intent mIntent = new Intent(mContext, other_Activity.class);
        startActivity(mIntent);
        
    }
}

위의 코드는 프로젝트 생성시 디폴트로 생기는 메인 엑티비티 입니다.

액티비티에서 뷰들을 관리하고 다른 액티비티를 호출 하는 등의 동작을 할 수 있습니다.

 

 

2. 서비스 (Service)

서비스는 백그라운드에서 실행되는 프로세스를 의미합니다. 

서비스 컴포넌트는 보통 앱을 실행 후, 종료하여도 백그라운드에서 돌릴 수 있도록 만드는데 쓰입니다.

예를 들어 만보기 어플은 앱을 종료하고, 다른 앱을 쓰더라도 계속 걸음수를 셀수 있도록 백그라운드에서 실행되고 있습니다.

 

또한, 서비스는 애플리케이션의 구성요소이므로 새로 만든 후에는 항상 매니페스트에 등록을 해주어야 합니다. 

 

Service(서비스)의 특징

1. 화면이 없습니다. 백그라운드에서 실행되도록 만들어진 컴포넌트입니다.

2. 한번 실행된 서비스는 어플리케이션이 종료되도 계속해서 백그라운드에서 돌아갑니다.

3. 모든 서비스는 Service클래스를 상속받아서 사용합니다.

   그래서 서비스 클래스에 대한 공부가 되면 좋습니다.

4. 네트워크를 통해서 데이터를 주고 받는 것도 가능합니다.

 

서비스 예시

 

mainActivity.class

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button1 = findViewById(R.id.button1);
        Button button2 = findViewById(R.id.button2);

		Context mContext = this.MainActivity;
        
        button1.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // 서비스 시작
                Intent intent = new Intent(mContext, Music_Service.class); 
                startService(intent); 
            }
        });

        button2.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // 서비스 종료
                Intent intent = new Intent(mContext, Music_Service.class); 
                startService(intent); 
            }
        });


        
    }
}

manifest.xml

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
	//메니페스트 서비스 추가 
    <service android:name="Music_Service"></service>
</application>

 

test_Service.class

public class Music_Service extends Service {
    MediaPlayer mp3; // 음악 재생 객체

    // Service 객체와 데이터를 주고 받을때 사용하는 메서드
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    
    // 서비스 생성
    @Override
    public void onCreate() {
        super.onCreate();
        mp3 = MediaPlayer.create(this, R.raw.chacha);
        mp3.setLooping(false); // 반복재생
    }
    
     // 서비스가 호출될 때마다 실행
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mp3.start(); // 노래 시작
        return super.onStartCommand(intent, flags, startId);
    }

   // 서비스가 종료될 때 실행
    @Override
    public void onDestroy() {
        super.onDestroy();
        mp3.stop(); // 노래 종료

    }
}

//참고 : https://bitsoul.tistory.com/147

 

서비스 클래스를 상속받아 Music_Service를 만들어주고, 메니페스트에 service를 추가해줍니다.

첫번째 버튼을 누르면 서비스 실행, 두번째 버튼을 누르면 서비스 종료가 되는 간단한 예제입니다. 

 

생략된 부분이 있으니, 공부/이해의 용도로 봐주시길 바랍니다.

 

 

3. 콘텐트 제공자 (Contents Provider)

콘텐트 제공자는 데이터를 관리하고 다른 어플리케이션 데이터를 제공해주는 컴포넌트입니다.

보통 내부 데이터를 외부 데이터베이스로 전달할때 많이 사용합니다.

콘텐트 제공자는 생명주기를 가지고 있지 않습니다.

 

Content Provider(콘텐트 제공자)의 특징

1. 파일입출력, SQLiteDB, Web등을 통해서 데이터를 관리합니다.

2. 콘텐트 제공자를 통하여 다른 어플리케이션의 데이터도 변경할 수 있습니다.

 예를 들어 사용자의 전화번호 주소록을 이용하여, 응용 애플리케이션을 만드려고 하면 전화번호부 콘텐트 제공자를 사용하여 전화번호 주소록 데이터를 바꿀 수 있습니다.

 

 

 

 

4. 방송수신자 (BroadCast Reicever)

방송 수신자란 안드로이드에서 다양한 이벤트와 정보를 받아 반응하는 컴포넌트입니다. 브로드캐스팅은 메시지를 여러 객체에게 전달하는 방법을 의미하는데 이렇게 전달되는 브로드캐스팅 메시지를 방송수신자라는 어플리케이션의 구성요소를 이용해 받을 수 있습니다.

 

 

Broadcast Recevier(방송수신자)의 특징

1. 디바이스에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 알려줍니다.

 - 예를 들어 휴대폰에 이어폰 연결이 해제 되었을 경우 서비스에서 실행되고 있는 음악을 일시정지 시키려면, 브로드 캐스트 리시버를 통해, 이어폰 연결이 해제되었다는 정보를 수신하고 서비스를 종료해야합니다.

 

2. 수신기를 통해 디바이스의 상황을 감지하고 적절한 작업을 수행합니다.

3. 대부분 UI가 존재하지 않습니다.

댓글