Broadcast Receiver是Android SDK 的四大组件中唯一被动接收数据的组件。广播接收器最大的用处接收接收系统发出的信息。
广播可以静态的注册,也可以动态的注册
静态注册就是在AndroidManfiest.xml文件夹中注册:

<receiver android:name=".MyBroadcastReceiver" android:enabled="true">
     <intent-filter>
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
     </intent-filter>
</receiver>

其中android.provider.Telephony.SMS_RECEIVED是接收短信的广播动作,当然还得添加接收短信的权限

<uses-permission android:name ="android.permission.RECEIVE_SMS"/>

动态注册就是在java代码中实现:

public class Main extends Activity implements View.OnClickListener{
    //ShortMessageReceiver是一个继承Broadcast Receiver的类
    private ShortMessageReceiver shortMessageReceiver;
    private Button btnRegister,btnUnregister;
    @Override
    public void onCreate(Bundle savedlnstanceState){
        super.onCreate(savedlnstanceState);
        setCntentView(R.layout.main);
        shortMessageReceiver = new ShortMessageReceiver();
        btnRegister = (Button) findViewById(R.id.btnRegister);
        btnUnregister = (Button) findViewById(R.id.btnUnregister);

        btnRegister.setOnClickListener(this);
        btnUnregister.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
           case R.id.btnRegister:
              //注册
              registerReceiver(shortMessageReceiver,
                   new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
              //注册完成给个通知
              Toast.makeText(this,"注册成功",Toast.LENGTH_LONG).show();
              break;
           case R.id.btnUnregister:
              //注销广播
              unregisterReceiver(shortMessageReceiver);
              Toast.makeText(this,"注销成功",Toast.LENGTH_LONG).show();
              break;
        }
    }
}

写完俩个注册机制,现在写个示例,关于短信拦截

public class ShortMessageReceiver extends BroadcastReceiver{
    //每接收到一个广播,系统都会调用onReceive方法
    @Override
    public void onReceive(Context context,Intent intent){
        Bundle bundle = intent.getExtras();
        if(bundle != null){
           Set<String> keys = bundle.keySet();
           //查看收到的广播包含哪些数据
           //数据是以key-value形式存储
           for(String key : keys){
               Log.d("key",key);
           }
           //获得收到的短信数据,所有的短信数据都要通过pdus的key获取
           Object[] objArray = (Object[]) bundle.get("pdus");
           //定义封装短信内容的SmsMessage对象数组
           SmsMessage[] messages = new SmsMessage[objArray.length];
           //循环处理所有的短信
           for(int i = 0;i<objArray.length; i++){
               //将每条短信数据装换成SmsMessage对象
               messahes[i] = SmsMessage.createFromPdu((byte[]) ibjArray[i]);
               //获得发送短信的电话号码和短信内容
               String s = "手机号:" + messages[i].getOriginatingAddress() + "\n";
               s += "短信内容:" + messages[i].getDisplayMessageBody();
               //显示
               Toast.makeText(this,s,Toast.LENGTH_LONG).show();
           }
        }
    }
}

如果不知道接收的广播包含哪些数据,可以从Bundle.keySet()方法中获得这些数据的key,然后在LogCat中查看。
广播接收器可以设置优先级。
通过< intent-filter>标签的android:priority属性。该属性为一个整数,数值越大,优先级越高。

来去电拦截,监听电话状态:
来电:android.inetnt.action.PHONE_STATE
去电:android.inetnt.action.NEW_OUTGOING_CALL

public void onReceive(Context context,Intent intent){
    //获得电话管理服务
    TolephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
    switch(tm.getCallState()){
       case TelephonyManager.CALL_STATE_PINGING://响铃
          //获得来电电话号码
          String incomingNumber = intent.getStringExtra("incoming_number");
          Toast.makeText(this,incomingNumber,Toast.LENGTH_LONG).show();
          break;
       case TelephonyManager.CALL_STATE_OFFHOOK://接听电话
          Log.d("call_state","offhook");
          break;
       case TelephoyManager.CALL_STATE_IDLE://挂断电话
          Toast.makeText(this,"close",Toast.LENGTH_LONG).show();
    }
}
<intent-filter>
    <action andoid:name="android.intent.PHONE_STATE"/>
</intent-filter>
<!-- 添加权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

休眠状态:Inten.ACTION_SCREEN_ON
唤醒状态:Intent.ACTION_SCREEN_OFF

开机自启程序就是接受了手机启动完成的广播,然后做进一步处理.
启动完成的广播动作
android.intent.actionBOOT_COMPLETED

显示当前手机电量

public class Main extends Activity{
   private TextView tvBatteryChanged;
   private BroadcasrReceiver batteryChangedReceiver = new BroadcastReceiver(){
       @Override
       public void onReceive(Context context ,Intent intent){
           //判断接收到的是否为电量变化的Broadcast Action
           if(intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){
           //level表示当前电量的值
           int level = intent.getIntExtra("level",0);
           //scale表示电量总刻度
           int scale = intent.getIntExtra("scale",100);
           //将电量换算成百分比的形式
           tvBatteryChanged.setText("电池用量:" + (level * 100/scale) + "%");
           }
       }
   };
   @Override
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvBatteryChanged = (TextView)findViewById(R.id.tvBatteryChanged);
        //注册Receiver
        registerReceiver(batteryChangedReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
   }
}