Android低阶之【chapter-8】BroadCastReceive 广播

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()判断当前到时是什么类型的网络
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值