안드로이드 세계

[Android] 안드로이드 4대컴포넌트란?(feat. 생명주기) 본문

안드로이드(Android)/이론

[Android] 안드로이드 4대컴포넌트란?(feat. 생명주기)

리안94 2021. 1. 7. 13:47

안드로이드 4대 컴포넌트

안드로이드 4대 컴포넌트로는 액티비티, 서비스, 방송 수신자(BroadCast Receiver), 콘텐츠 제공자(Content Provider)가 있습니다. 이는 안드로이드 주요 구성 요소이며, 이들 간의 통신은 인텐트(Intent)를 이용합니다.

 

1. 액티비티(Activity)

어플리케이션 화면을 담당하는 컴포넌트입니다. 자바나 코틀린 소스에서 AppCompatActivity(안드로이드 하위 버전을 지원하는 Activity) 클래스를 상속받고 있어야 액티비티로 이용할 수 있습니다. 액티비티는 다음과 같은 생명주기를 가지며, 생명주기를 이용하여 원하는 기능을 구현합니다.

 

1) 생명주기 (출처 : https://kairo96.gitbooks.io/android/content/ch2.4.1.html)

 

 

2) Activity의 특징

1. 액티비티는 어플리케이션에서 반드시 하나는 존재하여야 합니다.

2. 두개의 액티비티를 동시에 보여줄 순 없습니다.

3. 액티비티 내에서는 프래그먼트를 통해 분할화면을 보여줄 수 있습니다.

4. 액티비티 이동시에는 플래그를 주거나 이전 액티비티를 종료하지 않을 경우, 스택 구조로 쌓이게 됩니다.

 

3) 샘플코드

class MainActivity : AppCompatActivity() { 
    override fun onCreate(savedInstanceState: Bundle?) { 
        super.onCreate(savedInstanceState) 
    } 
}

 

 

2. 서비스(service)

애플리케이션에서 백그라운드로 실행되는 컴포넌트입니다. 서비스는 화면이 없는 게 특징이며, 애플리케이션의 구성요소 중 하나이기 때문에 생성할 때, 매니페스트에 등록을 꼭 하셔야 합니다. 자바나 코 들린 소스단에서 Service 클래스를 상속받아야 합니다.

 

1) 생명주기(출처 : https://ndpaulkim.tistory.com/92)

 

 

2) 특징

1. 화면이 없습니다.

2. 한번 시작된 서비스는 백그라운드에서 돌아갑니다. 단, 오레오 이상 버전부터 애플리케이션 종료 시, ForeGroundService를 사용하지 않는다면 종료됩니다.

3. 네트워크 통신, DB통신 등을 할 수 있습니다.(액티비티에서도 별도의 Thread를 이용한다면 통신 가능)

4. bindService와 startService 두 개의 메서드로 서비스를 시작할 수 있습니다. (bindService는 서비스가 실행되는 동안 지속적으로 액티비티와 통신하기 위해 사용됩니다.)

5. 매니패스트 옵션으로 export, enable 두 개가 있습니다.(export = 앱 외부에서 접근 가능한가, enable = 서비스가 인스턴스화 가능한가)

 

3) 코드

class MyService : Service() {
	
    //bindService
	override fun onBind(intent: Intent): IBinder {
		TODO("Return the communication channel to the service.")
	}
	
    //startService
	override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 
		return super.onStartCommand(intent, flags, startId) 
	}
    
}

 

3. 방송 수신자(BroadCast Receiver)

애플리케이션은 게시 - 구독과 같은 디자인 패턴과 유사한 브로드캐스트 메시지를 주고받을 수 있습니다. 관심 있는 이벤트가 발생할 시 이러한 브로드 캐스트가 전송됩니다. 따라서 방송 수신자(BroadCast Receiver)는 애플리케이션에서 특정한 이벤트를 받아 반응하는 컴포넌트입니다.

 

1. 특징

1. 사용자가 설정한 어떠한 이벤트가 발생하였을 시 반응합니다.

2. 정적 브로드캐스트와 동적 브로드캐스트가 있습니다.

3. 정적 브로드캐스트란 매니패스트에 등록하는 방송 수신자(BroadCast Receiver)를 말합니다.

- 오레오 이상 버전부터는 암시적 브로드캐스트를 이용할 수 없습니다. 다만, 몇 가지 암시적 브로드캐스트는 제외합니다.(암시적 브로드캐스트란, 앱을 구체적으로 타기팅하지 않은 브로드캐스트를 뜻함)

4. 동적 브로드캐스트란 콘텍스트에 등록하는 방송 수신자(BroadCast Receiver)를 말합니다.

5. enable, export는 서비스와 같은 역할을 합니다.

 

2. 코드

2-1. 정적 브로드캐스트

// manifests
<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
          <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
    </intent-filter>
</receiver>

//receiver
class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        TODO("MyReceiver.onReceive() is not implemented")
    }
}

//부팅될때, 입력수단이 바뀔때 리시버작동

 

예외사항은 다음과 같습니다.

https://developer.android.com/guide/components/broadcast-exceptions?hl=ko

 

2-2. 동적 브로드캐스트

class MainActivity : AppCompatActivity() {

    private val myReceiver = MyReceiver()

    override fun onResume() {
        super.onResume()

        1,2
        val filter = IntentFilter("action")
        registerReceiver(myReceiver, filter)

        3.
        LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, filter)
    }

    override fun onPause() {
        super.onPause()

        1,2
        unregisterReceiver(myReceiver)
   
        3.
        LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver)
    }
}

//receiver
class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        TODO("MyReceiver.onReceive() is not implemented")
    }
}


//전송
Intent().also {
      it.action = "action"

      1.
      sendOrderedBroadcast(it, "String")

      2.
      sendBroadcast(it)

      3.
      LocalBroadcastManager.getInstance(this).sendBroadcast(it)
}

 

브로드캐스트 전송방법

1. sendOrderedBroadcast(Intent, String) 메서드는 한 번에 하나의 수신자에 브로드캐스트를 전송합니다. 각 수신자는 차례로 실행되기 때문에 결과를 다음 수신자로 전파하거나 브로드캐스트를 완전히 중단하여 브로드캐스트가 다른 수신자로 전달되지 않도록 할 수 있습니다. 수신자가 실행되는 순서는 일치하는 인텐트-필터의 android:priority 속성으로 제어할 수 있습니다. 우선순위가 동일한 수신자는 임의의 순서로 실행됩니다.

2. sendBroadcast(Intent) 메서드는 정의되지 않은 순서로 모든 수신자에 브로드캐스트를 전송합니다. 이를 일반 브로드캐스트라고 합니다. 일반 브로드캐스트는 상당히 효율적이지만 수신자가 다른 수신자의 결과를 읽거나 브로드캐스트로부터 수신한 데이터를 전파하거나 브로드캐스트를 중단할 수 없음을 의미합니다.

3. LocalBroadcastManager.sendBroadcast 메서드는 발신자와 동일한 앱에 있는 수신자에 브로드캐스트를 전송합니다. 앱 간에 브로드캐스트를 전송할 필요가 없다면 로컬 브로드캐스트를 사용합니다. 구현이 훨씬 더 효율적이며(프로세스 간 통신이 필요 없음) 다른 앱이 브로드캐스트를 수신하거나 전송할 수 있는 측면과 관련된 보안 문제에 관해 걱정할 필요가 없습니다.

 

참고 : https://developer.android.com/guide/components/broadcasts?hl=ko

 

4. 콘텐츠 제공자(Content Provider)

중앙 저장소의 역할을 하고, 데이터 액세스를 관리합니다. 다른 애플리케이션에서 기존 콘텐츠 제공업체에 액세스 하기 위한 코드를 구현하거나, 내 애플리케이션에서 새로운 콘텐츠 제공업체를 생성하여 다른 애플리케이션과 데이터를 공유하고자 할 수 있습니다. 주로 데이터베이스를 이용할 때 많이 사용합니다.

 

 

 

 

1. 특징

1. 생명주기가 존재하지 않습니다.

2. 다른 애플리케이션의 데이터를 변경할 수 있습니다.

3. 데이터베이스(Sqllite), 파일 입출력, Web 등을 이용할 때 사용합니다.

 

참고 : https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ko

Comments