1、android的广播分为:广播发送者和广播接收者。广播就是一个全局监听器,用于监听系统全局的广播消息。只有继承到Broadcast的类才能捕捉到系统发出的广播消息。让后你想干嘛就干嘛呗。O(∩_∩)O
2、android中可以用到广播的地方:1.同一app内部的同一组件内的消息通信(单个或多个线程)
2.同一app内部的不同组件之间的消息通信(单个进程)
3. 同一app具有多个进程的不同组件之间的消息通信
4. 不同app组件之间的消息通信
5.android系统在特定情况下与app之间的消息通信
3、创建广播发送者 代码:
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.Toast;
/**
* 广播发送者
* @author rou
* @date 2016年3月30日
*/
public classMainActivity extends Activity {
privateButton button;
privateOnClickListener Listener = new OnClickListener() {
@Override
publicvoid onClick(View arg0) {
Intentintent = new Intent();
intent.setAction("com.love");//指定广播的频率
intent.putExtra("name","xiaorou");//指定广播发送出去的消息
MainActivity.this.sendBroadcast(intent);//发送广播
Toast.makeText(getApplicationContext(), "发送广播成功",1).show();
}
};
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(Listener);
}
}
4、创建广播接收者 代码:
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
/**
* 自定义广播接收者
* @author rou
* @date 2016年3月30日
*/
public classMyBroadcastReciver extends BroadcastReceiver{
@Override
publicvoid onReceive(Context context, Intent intent) {
Stringname = intent.getExtras().getString("name");
System.out.println("接受到"+name);
}
}
AndroidManifest.xml:
<!-- 注册广播接收(静态) -->
<receiverandroid:name="com.myandroidexerciseone.MyBroadcastReciver"> name:的值为类的全路径
<intent-filter>
<actionandroid:name="com.love"/> 相当于是指定接收的广播的频率
</intent-filter>
</receiver>
5、注册广播接收者: 静态注册:如上,在安卓清单文件中注册。
动态注册: 在应用程序被启动时执行注册,相对应的在应用程序退出时,必
须要取消注册。注册:context.registerReceiver(receiver,filter);
取消注册:context.unregisterReceiver(reciever);
动态注册:
代码:oncreate 方法里: 1.实列化一个过滤器
IntentFilterintentFilter = new IntentFilter();
2.添加过滤的Action值
intentFilter.addAction(Intent.Action_AIRPLANE_MODE_CHANGED);
3.实例化广播监听
NetChangReceivernetChangReceiver = new NetChangReceiver();
4.将广播监听器和过滤器注册在一起
registerReceiver(netChangReceiver,intentFilter);
onDestory方法里:销毁activity时取消注册广播监听
unregisterReceiver(netChangReceiver);
6、广播的分类: 有序广播:普通广播不能中断,所有监听这个广播的都能收到信息。而有序广播
可以中断。 中断广播的传播:abortBroadcast();
优点:按优先级的不同,优先Receiver可对数据进行处理,并传递给
下一个Receiver。设置优先级,在<intent-filter>节点中添加
android:priority属性 ,取值范围:-1000~~1000
缺点:效率低。
优先接收到Broadcast的Receiver可通过setResultExtras(Bundle)方法将处
理结果存入Broadcast中。
粘性广播:主要是为了解决,在发送完广播之后,动态注册的接收者,也能够收
到广播。
列如:先发送一个广播,我的接收者是通过程序中的某个按钮动态
注册的,如果不是粘性广播,我注册完接收者肯定无法收到
广播了,要是通过发送粘性广播就能够在我动态注册完接收
者后也能收到广播。
添加权限<uses-permissionandroid:nnaem="android.permission.BROADCAST_STICKY"/>
生命周期:广播接收者的生命周期是非常短的,在接收到广播的 时候创建,onReceiver()方法
结束之后销毁。
注意:广播接收器的执行和activity以及service的执行一样都是由Android的Main主线程负责的。
所以为了避免对主线程的UI绘制工作产生严重的干扰,广播的onReceive方法中不能做
非常复杂的操作。因为这个方法的执行时间被限定到了10秒之内。否则就会报ANR异常。
7、系统广播:
开机启动:android.intent.action.BOOT_COMPLETED
权限:<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
android4.0无效,如果需要监听开机广播需要把应用升级为系统应用。
SD卡加载已完成:Intent.ACTION_MEDIA_MOUNTED
收到短信:android.provider.Telephony.SMS_RECEIVED
权限:<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
获取短信内容:Object[]objArray=(Object[])bundle.get("pdus");构建短信对象array
SmsMessage[] messages= new SmsMessage[objArray.length];根据收到的对象长度创建array长度
for(int i=0;i<objArray.length;i++){
messages[i]=SmsMessage.createFromPdu((byte[])objArray[i]);
}把每一个单元的pdu格式的短信转换成SmsMessage对象
for(SmsMessage s:sms){
String msg =s.getDisplayMessageBody();
String source =s.getDisplayOriginatingAddress();
}获取短信的内容和对方的手机号码
来电:android.intent.action.PHOTO_STATE
权限:android.permission.READ_PHONE_STATE
获取电话管理服务,获得电话状态:TelephonyManager tm =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
获取来电号码:intent.getStringExtra("incoming_number");
int state =tm.getCallState();来电三种状态:响铃 TelephonyManager.CAll_STATE_RINGING
接听 TelephonyManager.CALL_STATE_OFFHOOK
挂断 TelephonyManager.CALL_STATE_IDLE
去电:android.intent.action.NEW_OUTGOING_CALL
权限:android.permission.PROCESS_OUTGOING_CALLS
android.permission.CALL_PHOTO
得到去电话的号码:String phone = intent.getStringExtra(Intent.EXTRA_PHTOT_NUMBER);
屏幕休眠:休眠:intent.ACTION_SCREEN_ON
唤醒:Intent.ACTION_SCREEN_OFF
注意屏幕唤醒和休眠广播只能在代码中注册,在清单文件中将不起作用