퉁탕퉁탕 만들어보자

Android broadcast 수신 본문

Computer/Android

Android broadcast 수신

호숀티 2022. 5. 9. 22:38
반응형

broadcast를 내 앱에서 듣고 처리할 수 있다.

 

방법은 두가지이다.

 

첫번째 Android Manifest 에서 선언하는 방식

 

우선 broadcastReceiver를 extend하는 class를 구현한다.

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 브로드캐스트 받았을 때 처리
    }
}

AndroidManifest.xml 파일에 아래와같이 리시버를 등록한다.

<application>
        <receiver android:name=".internal.util.MyBroadcastReceiver" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW"/>
            </intent-filter>
        </receiver>
</application>

그러면 해당 Action에 해당하는 브로드캐스트가 왔을때 onReceive() 함수가 불리게 되..

야 하지만?

26이상을 타게팅 하면, 암시적 인텐트로 받을 수 있는 broadcast 가 많이 막혔다.

대부분 이런 에러가 찍히게 된다.

W/BroadcastQueue: Background execution not allowed: receiving Intent

짱남...

 

자 그래서 이제 이런 방식은 안되고, activity에서 등록해보자.

BroadcastReceiver broadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
        
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);

// register
getContext().registerReceiver(broadcastReceiver, filter);

// unregister
getContext().unregisterReceiver(broadcastReceiver);

 

그러면 이제 이 register 된 이후에 broadcast를 받을 수 있고, unregister하면 그 다음부터는 못받게 된다.

onResume에서 등록하고, onPause에서 해제하는 식으로 하면 백그라운드에서 받지 않고 포그라운드에서만 받아서 효율적으로 처리할 수 있다.

 

만약 register하는 getContext()대신 application context에 등록한다면, 해당 activity의 범위가 아닌 activity전체 범위에서 수신하게 된다.

 

 

몇가지 manifest 에서 등록이 허용되는 broadcast receiver가 불리면?

onReceive함수가 불리는 동안은 포그라운드 상태로 간주 -> 동작이 끝나고 리턴하면다시 백그라운드 상태다

 

 

자세한 내용 더보기

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

 

728x90
반응형

'Computer > Android' 카테고리의 다른 글

SoundPool을 활용해서 sound 효과 주기  (0) 2022.07.29
ImageButton Ripple 주기  (0) 2022.07.29
Android Webview Javascript interface  (1) 2022.05.08
View Binding  (0) 2022.05.08
Android Rendering?  (0) 2022.05.08