안드로이드 개발 22―방송 수신자 BroadcastReceiver의 원리와 등록

1. 방송 메커니즘의 기본 개념
어떤 사건이 발생할 때(예를 들어 문자가 오거나 전화가 오면)android 운영체제는 이 사건을 모든 등록된 방송 수신자에게 방송하고 이 사건을 처리하는 방송 수신자가 처리해야 한다.사실 이것이 일상생활의 방송이다.한 뉴스가 발생한 후에 방송국은 이 뉴스를 라디오를 켜는 사람에게 방송할 것이다. 이 뉴스에 관심이 있는 사람은 관심을 가지고 필기를 할 수도 있다.뉴스는 사건이고, 방송국은android시스템이며, 라디오를 켜는 사람은 방송 수신자이며, 관심 있는 사람은 이 사건을 처리해야 하는 방송 수신자이며, 필기를 하면 이 사건에 대한 조작이다.
2. 방송의 분류―일반방송과 질서방송
① 일반 방송: 완전히 비동기적이며 논리적으로 모든 방송 수신자에게 수신될 수 있다.장점은 효율이 비교적 높다는 것이다.단점은 수신자가 처리 결과를 다음 수신자에게 전달할 수 없고 방송 intent의 전파를 중지할 수 없다는 것이다.
② 질서정연한 방송: 수신자의 우선순위에 따라 수신자 중에서 한 번에 전파한다.예를 들어 세 개의 방송 수신자 A, B, C가 있는데 우선순위는 A>B>C이다.그럼 이 소식은 A에게 먼저 전하고 B에게 전하고 마지막에 C에게 전달한다.모든 수신자는 방송을 중지할 권리가 있다. 예를 들어 B가 방송을 중지하면 C는 수신할 수 없다.이외에 A는 방송을 받은 후 결과 대상을 조작할 수 있고, 방송이 B에게 전달될 때 B는 결과 대상에서 A가 저장한 데이터를 얻을 수 있다.만약 시스템이 문자를 받으면 보내는 방송은 질서정연한 방송이다.
3. 방송 수신자를 등록하는 두 가지 방식
① 안드로이드 매니페스트에서.xml에 등록
프로필에 등록된 수신자의 특징은 프로그램이 꺼졌음에도 불구하고 이 수신자는 흥미로운 방송을 받아들일 수 있다는 것이다. 예를 들어 휴대전화 배터리 전력의 방송 수신자는 어떤 프로그램을 열 필요가 없다.아래의 예는 1, 2 방송 수신자가 전화를 건 방송을 받는다.

  • android:label="@string/app_name">













  • /**
  • * 아날로그 전화 방송
  • *  
  • * @author 서월
  • *  
  • */

  • publicclass MainActivity extends Activity  
  • {  

  • @Override

  • publicvoid onCreate(Bundle savedInstanceState)  
  •    {  

  • super.onCreate(savedInstanceState);  
  •        setContentView(R.layout.main);  

  •        Intent intent = new Intent();  
  •        intent.setAction("android.intent.action.CALL");  

  • this.sendBroadcast(intent);  
  •    }  

  • }  

  • /**
  • * 매번 방송을 받을 때마다 새로운 BroadcastReceiver1이 생성되며, onReceive 방법을 처리한 후 다시 사용되지 않습니다
  • * 새로운 BroadcastReceiver1 객체 생성 시 수신
  • *  

  • * @author 서월
  • *  

  • */
  • publicclass BroadcastReceiver1 extends android.content.BroadcastReceiver  

  • {  
  • public BroadcastReceiver1()  

  •    {  
  •        Log.i("xy_Receiver", "construtor1");  

  •    }  

  • @Override
  • publicvoid onReceive(Context context, Intent intent)  

  •    {  
  •        Log.i("xy_Receiver", "onReceive1");  

  •    }  

  • }  

  • /**
  • * 브로드캐스트 수신자 2
  • *  
  • * @author 서월
  • *  
  • */

  • publicclass BroadcastReceiver2 extends android.content.BroadcastReceiver  
  • {  

  • public BroadcastReceiver2()  
  •    {  

  •        Log.i("xy_Receiver", "construtor2");  
  •    }  

  • @Override

  • publicvoid onReceive(Context context, Intent intent)  
  •    {  

  •        Log.i("xy_Receiver", "onReceive2");  
  •    }  

  • }  

  • /**

  • * 브로드캐스트 수신자 3
  • *  

  • * @author 서월
  • *  

  • */
  • publicclass BroadcastReceiver3 extends android.content.BroadcastReceiver  

  • {  

  • public BroadcastReceiver3()  
  •    {  

  •        Log.i("xy_Receiver", "construtor3");  
  •    }  

  • @Override

  • publicvoid onReceive(Context context, Intent intent)  
  •    {  

  •        Log.i("xy_Receiver", "onReceive3");  
  •    }  

  • }

  • ②Activity에 등록
    Activity에서 귀속 수신자는 이 프로그램에 따라야 하거나 BroadcastReceiver가 UI를 업데이트하는 데 사용되어야 합니다. 프로그램이 닫힐 때 수신자가 실행될 필요가 없기 때문에 AndroidManifest가 필요하지 않습니다.xml에 등록하고 Activity에 등록할 수 있습니다.
    /**
  • * Activity에 브로드캐스트 수신자 등록
  • *  
  • * @author 서월
  • *  
  • */

  • publicclass MainActivity extends Activity  
  • {  

  • private BroadcastReceiver receiver;  
  • privatestaticfinal String CALL_ACTION = "android.intent.action.CALL";  

  • @Override

  • publicvoid onCreate(Bundle savedInstanceState)  
  •    {  

  • super.onCreate(savedInstanceState);  
  •        setContentView(R.layout.main);  

  •    }  

  • /**
  • * 전화 한 통을 보내는 방송을 시뮬레이션
  •     *  
  •     * @param v

  •     */
  • publicvoid sendBroadCast(View v)  

  •    {  
  •        Intent intent = new Intent();  

  •        intent.setAction("android.intent.action.CALL");  
  • this.sendBroadcast(intent);  

  •    }  

  • publicvoid bindReceiver(View v)  
  •    {  

  •        receiver = new BroadcastReceiver();  
  •        IntentFilter intentFilter = new IntentFilter();  

  •        intentFilter.addAction(CALL_ACTION);  
  • this.registerReceiver(receiver, intentFilter);  

  •    }  

  • publicvoid unBindReceiver(View v)  
  •    {  

  • this.unregisterReceiver(receiver);  
  •    }  

  • }  

  • publicclass BroadcastReceiver extends android.content.BroadcastReceiver  
  • {  

  • @Override

  • publicvoid onReceive(Context context, Intent intent)  
  •    {  

  •        Log.i("xy", "receiver");  
  •    }  

  • }

  • 본 논문 은 'IT 서 뚱보 의 칼럼' 블로그 에서 나온 것 이니, 반드시 이 출처 를 보존해 주십시오http://woshixy.blog.51cto.com/5637578/1097197

    좋은 웹페이지 즐겨찾기