基础篇:4.熟练掌握BroadcastReceiver的接收和使用

1.广播

  既然要谈论到广播接收器,那必然先要来谈谈广播,毕竟两者相辅相成。在Android系统中有各种各样的广播如常见的:电池的使用状态、电话的接听、短信的接收等。应用开发者也可以在程序中发送出各种广播。那么广播到底是个什么东西?!---广播是一种广泛运用在应用程序之间传输信息的机制。广播的发送可以通过以下两种方式发送:

  (1)Context.sendBroadcast---广播无序事件,理论上,所有的接收者同时接收到广播。

   (2)Context.sendOrderedBroadcast---广播有序时间,接收者按照指定顺序接收,这样一来,每个接收者接收到的信息就有可能不同,优先级别低的接收者甚至有可能接收不到广播(如果前面的接收者终止了该广播)。

  Android的广播机制设计得很出色,原本很多需要开发者亲自监控操作的事情,现在都只需监听广播并作出相应操作即可,同时android提供了一个开发利器用于监听各种广播---BroadcastReceiver。

2.广播接收者

  广播接收者用于异步接收广播的Intent,BroadcastReceiver没有可视化的用户界面,但接收到广播后可以通过开启一个activity或者NotificationManager来通知用户。想让BroadcastReceiver能按用户的意图正常运行,需要进行两步操作:

  (1)创建自己的BroadcastReceiver类,该类继承自android.content.BroadcastReceiver,并实现其onReceive方法。

public class MyReceiver extends BroadcastReceiver {  
      
    private static final String TAG = "MyReceiver";  
      
    @Override  
    public void onReceive(Context context, Intent intent) {  
        String msg = intent.getStringExtra("msg");  
        Log.i(TAG, msg);  
    }  
  
}  

  用户可以在onReceive中实现自己的操作,如打开activity、NotificationManager等。  

  (2)注册一个指定的广播地址

    a)静态注册:静态注册是指在AndroidManifest.xml进行相应的配置:

<receiver android:name=".MyReceiver">  
            <intent-filter>  
                <action android:name="android.intent.action.MY_BROADCAST"/>  
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>  
</receiver>  

  其中action android:name...指定了该广播接收器可以接收这个指定地址的广播,换一个说法就是在广播接收器中注册了该地址的广播。

  b)动态注册:在代码中动态指定广播地址并进行注册:

MyReceiver receiver = new MyReceiver();            
IntentFilter filter = new IntentFilter();  
filter.addAction("android.intent.action.MY_BROADCAST");          
registerReceiver(receiver, filter);  

  动态注册的接收器,在程序被销毁前必须进行接触注册操作,否则系统将出现异常,解除注册的操作很简单:

protected void onDestroy() {  
    super.onDestroy();  
    unregisterReceiver(receiver);  
}  

静态注册和动态注册的最大区别就在于静态注册的广播接收器为长驻型,即程序被关闭后,如果有广播信息的传来,广播接收器也会被系统自动调用运行。

关于BroadcastReceiver和广播,还有更深一层的知识,待日后有更多接触以及更深一步的理解时再回头进行补充。

原文地址:https://www.cnblogs.com/dream550/p/3883783.html