此博客为学习Android开发的笔记型博客,若有任何不妥及需要补充之处,希望各位大神给予指正
广播
标准广播
有序广播
接收广播
通过BroadcastReceiver类接收广播
动态注册BroadcastReceiver:
1.在活动中新建内部类NetChangeReceive:
class NetChangeReceive extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"myBroadCast Received",Toast.LENGTH_SHORT).show();
}
}
新建intentfilter,并添加action “android.net.conn.CONNECTIVITY_CHANGE” 监听网络变化
//intentfilter:意图过滤器,声明期望收到的intent类型
intentFilter=new IntentFilter();
netChangeReceive=new NetChangeReceive();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(netChangeReceive,intentFilter);
//注册接收器:第一个参数为广播接收器,第二个参数为intentfilter
静态注册BroadcastReceiver
右键包->new ->other->BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"NetWorkChanged",Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: ");
}
}
静态注册的接收器,不管程序是否运行都能对广播进行接收
静态注册的接收器需要在配置文件中注册,但由于我们是直接new的BroadcastReceiver,Android Studio已经帮我们注册好了。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
新建intent-filter,添加action “android.net.conn.CONNECTIVITY_CHANGE”
<intent-filter>
<action android:name="com.example.myBroadCast"/>
</intent-filter>
需要说明的是:在Android8.0开始,对清单文件中的静态广播接收者增加了限制。像网络状态这种敏感的广播不能再进行监听。所以上面的静态广播接收者代码,你写出来后也是不会执行的。
发送自定义广播
发送标准广播
发送广播就需要我们之前提到的intent了。
新建一个按钮并添加事件:
隐式声明一个intent,然后用sendBroadcast方法把它广播出去就好了
Intent intent=new Intent("com.example.myBroadCast");
sendBroadcast(intent);
这里我们广播了一个action:com.example.myBroadCast
修改之前的静态广播接收器:
将intent-filter中的action改为com.example.myBroadCast
对静态广播接收器的限制仅限于像网络状态这种敏感广播,像这种我们自己定义的广播,它的接收就不受限制。
发送有序广播
发送有序广播仅需要将“sendBroadcast”方法改为“sendOrderBroadcast”方法即可。
Intent intent=new Intent("com.example.myBroadCast");
sendOrderBroadcast(intent,null);
sendOrderBroadcast方法接受两个参数,第一个参数仍然为intent,第二个参数是一个与权限相关的字符串,这里传null就好了。
有序广播的传递是有先后顺序的,现在我们就来设置它:
在配置文件中,我们修改MyReceiver的intent-filter:
<intent-filter android:priority="100">
<action android:name="com.example.myBroadCast"/>
</intent-filter>
我们添加了android:priority字段,表示receiver的优先级,值越大,优先级越高。
当然,有序广播还是可以被截断的:
我们修改MyReceiver的onReceive方法:
我们调用abortBroadcast()方法,将有序广播截断。
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"NetWorkChanged",Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: ");
abortBroadcast();
}
使用本地广播
之前发送的广播和系统广播都是全局广播,能够被所有的程序接收到。这就引来了很大的安全问题。
现在我们想要让广播变成本地广播,即只能在程序内部传播。
我们使用localBroadcastManager来对广播进行管理
总的来说就是:
把 sendBroadcast(intent) 改为
localBroadcastManager.sendBroadcast(intent)
把registerReceiver改为
localBroadcastManager.registerReceiver
把unregisterReceiver改为
localBroadcastManager.unregisterReceiver
这里我们使用了动态广播接收器,因为本地广播为程序内部的广播,程序已经运行,所以无需考虑静态广播接收器