-
Android Component - Broadcast ServiceAndroid/Component 2019. 7. 24. 23:30
Boadcast Reveicer는 한마디로 Event Model로 실행되는 Component라고 정의할 수 있다.
또한 Android Component중에서 Intent 매커니즘만 잘 이해하면 가장 쉽다고 말할 수 있다!
예를 들면 배터리가 부족하다던가!
리시버 사용 방법은 간단하다
1. BroadcastReceiver를 상속받은 클래스 생성
class MyBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Toast.makeText(context, "I am BroadcastReceiver", Toast.LENGTH_SHORT).show() } }
제목 그대로 BroadcastReceiver를 상속 받은 클래스를 생성하고 리시브를 받았을때 작동할 코드를 적어줍니다.
2. AndroidMenifest.xml 에 서비스 등록
<receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
해당 서비스를 명시적으로 등록을 해준다! ( 여기서 나오는 명시적은 아래에서 설명 하도록 하겠다 )
3. Intent 전송
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val intent = Intent(this, MyBroadcastReceiver::class.java) sendBroadcast(intent) } }
sendBroadcast 를 사용하여 인텐트를 전송해줍니다.
그러면 매니페스트에 등록 한것처럼 BOOT_COMPLETED하면 등록된 리시버가 작동하게 됩니다.
그러면 위에서 잠깐 언급되었던 명시적! 그러면 암시적도 있을까요?
네 있습니다.
리스버 중에서 매니페스트에 등록하면 작동하는 것이 있고 작동하지 않는 것이 있습니다.
동적으로 등록 해제를 하는 방법은 단순히 코드상에서 registerReceiver / unregisterReceivcer를 사용해주면 됩니다.
왜 이런식으로 구분하였냐면 바로 시스템이 부담이 되서 그렇습니다.
시스템에 부담되는 리시버를 매니페스트에 등록하면 안되겠죠..?
대표적으로 부팅 관련이 매니페스트에 등록하면 적용이 잘 되고
화면 On/Off 관련이 동적으로 등록해주어야 합니다.
4. BroadcastReceiver의 라이프 사이클
sendBroadcast 를 통해 인텐트를 전송하면 onReceiver가 실행됩니다.
onReceiver가 실행이 완료되면 바로 메모리에서 삭제 됨으로 주 업무 로직은 구현하기 힘듭니다.
또한, 한번 시작된 Broadcast를 10초안에서 메모리에서 자동 삭제되는 Rule을 가지고 있습니다.
5. 보조적으로 알아보는 Intent 매커니즘
Acitivity Intent는 어디선가 Activity를 띄어 달라는 인텐트가 발생하면 아래와 같이 상황에 따른 결과가 나타난다
1. 시스템 전역에 Acitivity가 0개 이다. ( 암시적으로 호출시 )
결과 ) Exception 에러가 나며 에러 코드 위치는 Intent 호출 라인이다.
2. 시스템 전역에 Acitivity가 1개 이다.
결과 ) 당연히 해당 Activity가 출력된다.
3. 시스템 전역에 Acitivity가 2개 이상 이다.
결과 ) 사용자가 선택한 Activity를 실행시킨다
하지만 Broadcast Intent는 어디선가 Broadcast를 발생하려는 인텐트가 발생되면
1. Action이 존재하지 않는다
결과 ) 에러가 나지 않고 그대로 Broadcast는 종료
2. 해당 Action이 존재한다 ( 1개 이상 )
결과 ) 모든 해당되는 Action이 실행된다.
대표적으로 카카오톡의 노티는 BootComplete가 되면 Receiver를 받아 Launcher App을 실행시킨다고 알고있다.
'Android > Component' 카테고리의 다른 글
Android Notification (0) 2019.07.25 Android JobSchduler (0) 2019.07.25 Android Background Limits (0) 2019.07.25 Android Component - Service (0) 2019.07.24