Android低阶之【chapter-8】BroadCastReceive 广播
android:enabled=”true” 能否被系统实列化 android:exported=”true” 能否被其他应用程序访问
onReceive不能进行耗时任务。如果onReceive()响应超过10s,就会出现ANR错误
一:BroadCastRecjeive 广播 ,可以看做是现实生活中的收音机 ,用来接收
1:注册文件中注册时候,写的广播接收类,如果写在Activity中需要写成静态的类,并且要有无参的构造函数;
private final staticStringLOG_TAG="MyReciever";
//写成内部类的形式,需要写个无参数的构造函数
public static classMyRecieverextendsBroadcastReceiver {
private final staticStringLOG_TAG="MyReciever";
//写成内部类的形式,需要写个无参数的构造函数
publicMyReciever() {
}
@Override
public voidonReceive(Context context, Intent intent) {
//在接受到广播消息,调用该onReceiver()方法
Log.v(LOG_TAG,"------------>收到广播消息");
MainActivity.mtext.setText("内部类中设置消息");
}
}
2:代码中注册,写的广播接收类在Activity中,不用写成静态和不必要有无参的构造函数
private classMyRecieverextendsBroadcastReceiver {//代码注册的时候,写广播类
private final staticStringLOG_TAG="MyReciever";
publicMyReciever() {
}
@Override
public voidonReceive(Context context, Intent intent) {
//在接受到广播消息,调用该onReceiver()方法
Log.v(LOG_TAG,"------------>收到广播消息");
mtext.setText("收到广播的消息了,真开心");
}
}
3:单独写的一个广播接受器类
packagecom.example.yangjie.broadcastreceive;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
/**
* Created by Administrator on 2015/9/28.
*/
public class MyReciever extends BroadcastReceiver {
private final staticStringLOG_TAG="MyReciever";
@Override
public voidonReceive(Context context, Intent intent) {
//在接受到广播消息,调用该onReceiver()方法
Log.v(LOG_TAG,"------------>收到广播消息");
}
}
二:广播接收器的注册(注册就相当于把这个广播接收器与Activity绑定在一起)
BroadCastRece注册分两种,一种是在注册文件中注册,一种是在代码中注册
1:注册文件中注册(优点:应用程序退出后依然可以接受广播,缺点:消耗资源相对较多)
<receiverandroid:name=".MainActivity$MyReciever"android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.example.yangjie.broadcastreceive.ACTION1"/>
<action android:name="com.example.yangjie.broadcastreceive.ACTION2"/>
<action android:name="com.example.yangjie.broadcastreceive.ACTION3"/>
</intent-filter>
</receiver>
2:代码中注册(优点:消耗资源比较少,缺点:应用退出后就不能再接收广播)
myReciever=newMyReciever();
IntentFilter filter=newIntentFilter();
filter.addAction("com.example.yangjie.broadcastreceive.ACTION1");
registerReceiver(myReciever,filter);
//在代码中注册广播,一定解除注册,oncreate()注册,ondestroy()解除,onstart()注册,onstop()解除 onpause()注册,onpause()解除
protected voidonDestroy() {
super.onDestroy();
unregisterReceiver(myReciever);
}
三:传递消息
Intent intent=newIntent("com.example.yangjie.broadcastreceive.ACTION1");
//上面的字符串,就相当于有一个发送的频率,让别的广播接收器通过这个频率来接收
sendBroadcast(intent);
四:有序广播
1:有序广播就是在注册时加个priority=”1000”,值越大表示优先执行(1-1000)
<receiverandroid:name=".ThirdReceive"android:enabled="true" android:exported="true">
<intent-filter android:priority="50">
<action android:name="com.example.yangjie.broadcastreceive.ACTION1"/>
</intent-filter>
</receiver>
2:取消广播
abortBroadcast();//相当于收音机的开关,关掉了,不再接收频率,比如说有三个广播接收器,在第二个广播接收器中设置取消广播,就不会执行第三个广播接收器
在传广播加入代码
Intent intent=newIntent("com.example.yangjie.broadcastreceive.ACTION1");
sendOrderedBroadcast(intent,null);
sendBroadcast(intent)
3:广播接收器传递处理结果
setResultData("FirstReceiver的处理结果");//在第一广播接收器中设置处理结果
String date=getResultData();//在第二个广播接受器中获取上一个广播接收器的结果
五:接受系统的广播的应用
1:接受手机电池的广播
注册文件:
<receiver
android:name=".BateryReceiver"
android:enabled="true"
android:exported="true">
<intent-filterandroid:priority="1000">
<actionandroid:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>
广播接收器
public classBateryReceiverextendsBroadcastReceiver {
publicBateryReceiver() {
}
@Override
public voidonReceive(Context context, Intent intent) {
if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){
BatteryManager manager=(BatteryManager)context.getSystemService(context.BATTERY_SERVICE);
Bundle bundle=intent.getExtras();
/* Set<String> keys=bundle.keySet();//显示出电池的属性
for(String key:keys){
bundle.get(key);
}*/
inthealthy=bundle.getInt("health");
}
}
}
2:接受网络变换的应用(比如现在是有线网络,还是无线网络,还是蓝牙网络……)
1:注册文件
<receiver
android:name=".NetReceiver"
android:enabled="true"
android:exported="true">
<intent-filterandroid:priority="1000">
<actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
2:广播接收器
public classNetReceiverextendsBroadcastReceiver {
private final staticStringLOG_TAG="NetReceiver";
@Override
public voidonReceive(Context context, Intent intent) {
//获得网络连接服务
ConnectivityManager manager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
//获得激活状态网络
NetworkInfo networkInfo=manager.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected()){
}
Log.v(LOG_TAG,"----->"+ networkInfo.getType());//networkInfo.getType()判断当前到时是什么类型的网络
}
}