Android中BroadcastReceiver的使用

由于初学,了解的还不是很全面,写一点,记录下来

1.标准广播

1.1 接收广播

比如系统网络改变会发送一条action为“android.net.conn.CONNECTIVITY_CHANGE”的广播
那么活动中如何去接收这条广播呢

1.1.1动态广播注册

自定义广播接收器继承BroadcastReceiver重新onReceive()方法
   public class NetworkchangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
        //这个可以不用管,知道它是收到广播后执行的逻辑就可以了
            ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if(networkInfo!=null&&networkInfo.isConnected()){
                Toast.makeText(context,"已连接",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(context,"未连接网络",Toast.LENGTH_SHORT).show();
            }

        }
    }
在活动中注册和取消注册
//在活动的onCreate()方法中
		intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//动态添加action,这是系统网络变化会发送的一条广播的action
        networkchangeReceiver = new NetworkchangeReceiver();
        registerReceiver(networkchangeReceiver,intentFilter);//注册广播


//别忘了取消注册,一般在onDestroy或者onPause方法中
		unregisterReceiver(networkchangeReceiver);//取消注册

1.1.2静态注册广播

所谓静态注册广播,就是在AndroidManifest.xml中的intentFilter添加action,其它与动态注册一样
通过file+ new创建一个BroadcastReceiver会在AndroidManifest自动生成一个< receiver>

<receiver
android:name=".NetworkchangeReceiver "
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
</intent-filter>
</receiver>

1.2发送自定义广播

发送自定义广播就是自己定义一个action,想获取这条广播的接收器添加这个action就好

Intent intent = new Intent("com.example.diybroadcast.my");发送一条action为com.example.diybroadcast.my的广播
sendBroadcast(intent);

接收这条广播的方法如1.1

2有序广播

2.1有序广播的发送

有序广播较无序广播的发送方式有所区别

Intent intent = new Intent("com.example.diybroadcast.my");
sendOrderedBroadcast(intent,null);//第二个参数是一个与权限有关的字符串,传入null也可

2.2接收有序广播

如果不设置优先级的话,有序广播和无序广播并没有区别
那如何设置接收器的优先级呢,其实很简单
给intent-filter添加android:priority属性就好

比如:

<receiver...>
<intent-filter  android:priority="100">//利用priority设置优先级,数字越大,级别越高
<action android:name="..."></action>
</intent-filter>
</receiver>

2.3有序广播的截断

优先级比较高的就可以先接收到广播,可以截断广播,截断后这条广播就会停止,后面的优先级低的广播接收器就接收不到这条广播了
其实很简单,在优先级高的接收器的receive()方法里调用abortBroadcast()方法就好。

3本地广播

除了比标准广播多了一个本地广播管理器LocalBroadcastManager ,其它都差不多
本地广播管理器LocalBroadcastManager 的作用就是,广播发送和接收器注册都需要通过LocalBroadcastManager 来实现
由于是向本地发送,所以活动启动才有意义,所以本地广播都是动态注册
完整测试代码如下,其中button是用来发送广播的

public class MainActivity extends AppCompatActivity {
private LocalBroadcastManager localBroadcastManager;
private LocalReceiver localReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);//单例获取本地广播管理者
Button button = (Button)findViewById(R.id.send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.hugh.zhao");
localBroadcastManager.sendBroadcast(intent);//利用localBroadcastManager发送本地广播
}
});
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.hugh.zhao");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);//利用localBroadcastManager注册广播接收器
}

@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);//利用localBroadcastManager取消注册广播接收器
}

class LocalReceiver extends BroadcastReceiver{ //自定义本地广播接收器
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(MainActivity.this,"received from this app",Toast.LENGTH_SHORT).show();...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值