Android广播Broadcast基础理解概述

Android广播基础理解

广播可以分为系统广播和自定义广播,系统广播就是手机系统根据自身状态信息发出相应的广播,比如电池电量不足10%、手机完成开机、手机所在地理位置发生了变化(从安徽跑到了江苏)等,这些情况下系统都会发出一条广播,应用程序可以选择接收或者不接收。

一.广播的动态和静态注册

1.动态注册

即不在AndroidManifest.xml文件中声明广播接收者,而是在需要接收某广播的Activity的生命周期方法中进行广播接收者的注册和解除注册:

public class OneActivity extends AppCompatActivity {
    private IntentFilter filter;
    private NetWorkChangeReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_one);
	filter = new IntentFilter();
	filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
	receiver = new NetWorkChangeReceiver();
	registerReceiver(receiver, filter);
    }
    @Override
    protected void onDestroy() {
    	super.onDestroy();
	unregisterReceiver(receiver);
    }

    class NetWorkChangeReceiver extends BroadcastReceiver {
    	@Override
	public void onReceive(Context context, Intent intent) {
	    //接收到网络状态变化的广播时在此执行操作
	}
    }
}

动态注册的广播是一定要取消注册的,上面代码中接收的是网络状态变化的广播,此时当OneActivity已经被创建并且没有被销毁(即还存在于Activity堆栈中,不一定是栈顶),一旦网络状态变化就会执行onReceive方法中的操作。动态注册和静态注册不同的一点是只有当应用程序启动之后才会接收广播,而且onReceive方法中不允许有大量的数据和耗时操作,否则会报错

上述的紫色和绿色代码可以分别写到onResume和onPause方法中,这种情况下OneActivity必须在activity堆栈的栈顶时才可以接收网络状态变化的广播,并且OneActivity一旦不在栈顶接收者就会被销毁

2.静态注册

就是在AndroidManifest.xml文件下声明广播接收者,静态注册广播接收者可以使应用程序在未启动的情况下就能接收广播:

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

二.自定义广播的无序和有序

1.无序广播

即同一个广播的所有接收者会同时接收发出的广播,广播的发出:

btn123.setOnClickListener(v -> {
    Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
    sendBroadcast(intent);
});

2.有序广播

即不同接收者之间有优先级顺序,高优先级的接收者可以截断广播使低优先级无法接收广播,在高优先级的接收者onReceive方法中加上abortBroadcast()方法就可以截断广播。对于优先级的设置是在AndroidManifest.xml中添加属性:

<receiver
    android:name=".NetWorkChangeReceiver"
    android:enabled="true"
    android:exported="true">    
    <intent-filter android:priority="100">  这个值可以是-1000~1000  
	<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>    
    </intent-filter>
</receiver>

上面是静态注册的优先级设置,动态注册时如下:

IntentFilter filter = new IntentFilter();

filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);//这个值就是1000,也可以直接用-1000到1000的整数作为参数

发出广播:

btn123.setOnClickListener(v -> {
    Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
    sendOrderedBroadcast(intent, null);
});

三.本地广播

上面说的广播都是全局广播,即所有的应用程序下的接收者都可以进行接收,这样就会存在一定的安全性问题。本地广播就是只能在本应用程序中进行传递,其他的app无法访问该广播,并且本地广播接收器只能接收本应用程序的广播。还有重要的一点是本地广播无法通过静态注册的方式来接收,因为静态注册就是为了让程序在未启动的情况下就可以接收到广播,而本地广播是在本应用程序中进行接收,此时的本应用程序是已经启动的,所以本地广播接收器只能用动态注册

具体的代码可以参考:https://blog.csdn.net/u010126792/article/details/82417190

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我们间的空白格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值