ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 브로드캐스트 수신자 Broadcast Receiver
    Android 2019. 7. 9. 07:23

     

    안드로이드 4가지 구성요소 중 하나

     

     


    개념


     

    - 안드로이드 시스템은 특정 이벤트에 대해 브로드캐스트 메시지를 전달

    - 특정 브로드캐스트 메시지(action)를 받으려면 해당하는 브로드캐스트 수신자를 등록

     

     

     브로드캐스트 수신 및 처리방법 2가지 

    과정

    리시버 생성

    - 인텐트 필터 설정으로 원하는 action 등록

     

    1. 

    리시버 생성 :BroadcastReceiver 클래스 상속 

    action등록 : AndroidManifest 에 원하는 action 선언

    2.

    리시버 생성 : 다른 컴포넌트에서 BroadcastReceiver 객체 생성

    action 등록 : IntentFilter 객체 생성

     

     

     

     

     


    브로드캐스트 수신 및 처리 방법 2가지 


     

    • BroadcastReceiver 클래스 상속 & AndroidManifest 에 원하는 action 선언

     

     과정 

    1. BroadcastReceiver 클래스 상속

    2. 생성하면 AndroidManifest.xml 에 해당 <receiver> 등록

    3. <intent-filter>안에 원하는 action등록

    4. 해당 리시버클래스에서 onReceive 메소드 오버라이드

     

     


     

     

    - BroadcastReceiver 클래스 상속

    public class SmsReceiver extends BroadcastReceiver {
     
        // 해당 브로드캐스트 수신시 이 메소드가 자동 호출됨 
        @Override
        public void onReceive(Context context, Intent intent) {
           //처리
            
        }
    }
     

    onReceive 메소드에서 원하는 action을 처리한다 

     

     

    -  AndroidManifest.xml 에서 <intent-filter> 설정

    ※ 브로드캐스트 리시버의 경우  <receiver>안에 설정

     <receiver
        android:name=".리시버클래스이름"
        android:enabled="true"
        android:exported="true">
        
        <intent-filter>
           <!-- 이안에 받고싶은 action을 등록 --> 
           <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
        
     </receiver>

    예시의 SMS_RECEIVED 는 SMS 수신

     

     


     

     

    • BroadcastReceiver 객체 생성 & IntentFilter 객체 생성 

     과정 

    1. 다른 context 에서 BroadcastReceiver 객체 생성 및 onReceive 메소드 오버라이드

       //리시버 정의
       BroadcastReceiver br = new BroadcastReceiver(){
           @Override
           public void onReceive(Context context, Intent intent) {
              //처리
           }
       }

     

    2. IntentFilter 클래스로 원하는 action등록

    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.원하는액션);  //액션 등록

     

    3. registerReceiver() 호출하여 리시버 등록

    registerReceiver(BroadcastReceiver 객체, IntentFilter 객체);

     

    ※ 코드상에서 리시버 등록시 context가 종료될때

    리시버 등록해제 과정 필요 (불필요한 리소스 사용방지)

    등록해제는 unregisterReceiver() 호출

    unregisterReceiver(BroadcastReceiver 객체);

     

     

     


     

     

    예시)

    * FLAG_ACTIVITY_NEW_TASK 플래그를 설정해서

    현재 액티비티 스택 구조와 상관없이

    이벤트 발생시 해당 리시버가 호출한 액티비티를 스택에 넣어 화면에 표시한다.

    public class MainActivity extends Activity{
    
       //리시버 정의
       BroadcastReceiver br = new BroadcastReceiver(){
           @Override
           public void onReceive(Context context, Intent intent) {
              //액티비티에 처리넘기기 
              Intent it = new Intent(context, 처리를원하는액티비티.class);
              
              /*intent 값 처리 코드 필요 */
              
              //플래그 설정
              it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              
              //액티비티 호출 
              context.startActivity(it); 
           }
       }
       
       @Override
       public void onCreate(Bundle savedInstanceState){
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          
          //원하는 액션 등록 
          IntentFilter filter = new IntentFilter();
          filter.addAction(Intent.ACTION_SCREEN_ON);
       
          //리시버 등록
          registerReceiver(br, filter);
       }
       
       protected void onDestroy(){
         if(br != null) {
           //리시버 해제
           unregisterReceiver(br);
           br = null;
         }
         super.onDestroy();
       }
    }

     

    ※ 이방법은 해당 context가 유효할때만 수신가능

    액티비티라면 onDestroy() 될때까지 수신

     

    ※ 중복등록을 막기위해 생명주기에 따라 일관성 있게 등록해야함

    onCreate() 에서 등록했으면 onDestroy() 에서 해제

    onResume() 에서 등록했으면 onPause() 에서 해제

     


    브로드캐스트 보내기


     

    시스템이 보내는거 말고 내가 정의해서 보내기

     

    방법

    1. 해당 action에 대한 Intent 설정

    Intent intent = new Intent(context, 클래스이름.class);
    intent.setAction("원하는액션이름");
    sendBroadcast(intent);

    2. sendBroadcast(intent) 호출해서 브로드캐스트

     

     


     

     

    특정 패키지에 전달하려면

    intent의 setPackage() 메소드 이용 

     

     

    하나의 앱 에서 브로드캐스트를 수신하려면

    LocalBroadcastManager 클래스 사용

    LocalBroadcastManager.getInstance(Context).registerReceiver(BroadcastReceiver, IntentFilter)
    LocalBroadcastManager.getInstance(Context).sendBroadcast(IntentFilter)

     

     

     

     

     

     

     

Designed by Tistory.