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));
}
}