简单认识
广播机制的作用:
一句话说白就是消息通知,例如平时使用的软件,断网时,就经常有看到Toast提示的 “无法连接到网络”、使用微信或者其他软件在不同的手机上重复登录,逼迫下线的已登账号返回登录界面的动作等都是用到了广播机制
广播的类型主要分为两种:
1.标准广播-----异步执行广播
一条标准广播发出后,所有广播接收器都将在同一时间收到,没有先后顺序,发出后也将无法截断
2.有序广播-----同步执行广播
一条有序广播发出后,所有广播接收将会按优先级别先后接收该广播,广播被优先级高的接收器接收后可被其截断
简单应用
1.广播接收器的创建+注册广播
2.发自定义广播
广播接收器的创建:创建一个继承自BroadcastReceiver的类就OK
class ForceOfflineReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("Warning");
builder.setMessage("You are fored to be offline.Please try to login agin.");
builder.setCancelable(false);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();
Intent intent=new Intent(context,MainActivity.class);
context.startActivity(intent);
}
});
builder.show();
}
}
这个类重写onReceive,这里就可以看到,当程序收到广播后,进行相应的逻辑处理就是在该方法内去写
注册广播(有两种方式)
1.动态注册
2.静态注册
动态注册
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.example.haha.broadcasttest.FORCE_OFFLINE");//添加指定要接收的广播
receiver=new ForceOfflineReceiver();
registerReceiver(receiver,intentFilter);//进行广播注册 第一个参数:广播接收器 第二个参数: 指定要接收的广播
静态注册
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
在AndroidManifest.xml文件里去添加receive标签,再在receiver里添加intent-filter标签,对比动态,这段代码类似动态注册,这里就不多说
现在静态注册这段代码不用去手打,可以自动生成
com.example.XXX包(右击)-->(选择)New-->(选择)Other-->(选择)Broadcast Receiver,这样就完成自动创建一个接收器,注册代码段也会自动添加到在AndroidManifest.xml文件里。
如何发一条自定义广播
上面指定的广播都是标准广播,异步发送无法截断
接下来通过自定义广播的学习去感受 标准广播 和 有序广播
自定义标准广播
Intent intent=new Intent("com.example.haha.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
自定义有序广播
Intent intent=new Intent("com.example.haha.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);
设置有序广播的接收优先级别 直接在intent-filter标签里添加 priority的属性就行,数值越大,优先级越高 数值范围(-1000到1000)
ps:在不声明优先级的前提下,动态注册的广播接收器比静态注册的优先级高
静态注册设置优先级
<intent-filter android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
动态注册设置优先级
intentFilter.setPriority(-
1000
);
使用本地广播
先谈下为什么需要本地广播
前面我们说到的广播,发出去,手机所有的应用都会收到,那就会带来信息安全上的问题、被截断、接收到其他程序的垃圾广播等一系列问题。
所以使用本地广播的话,可以限制发出的广播和接收到的广播范围仅在本程序内。
使用 LocalBroadcastManager 对广播进行管理
先获取LocalBroadcastManager的实例:由LocalBroadcastManager.getIntance()返回一个实例 localBroadcastManager
然后由该实例发送广播:localBroadcastManager.sendBroadcast(intent)
既然是接收本地的广播,那么自然注册的也应该是本地接收器:localBroadcastManager.registerReceiver(Receiver,intent);
截断广播
就一句
在onReceive()里写abortBroadcast();