标签:main enabled XML rmi 同步 cas gets 发送 逻辑
广播是Android的一个重点,分为标准广播和有序广播
标准广播(Normal broadcasts)完全异步执行,所有接收器同时接收到广播,效率较高。同时无法被截断
有序广播(Ordered broadcasts)同步执行。优先级高的接收器优先接到广播,并有权限截断广播
首先我们看一下怎么用IntentFilter动态注册广播监听网络变化
首先声明全局变量
private IntentFilter intentFilter;
private NetworkChangeReceiver netWorkChangeReceiver;
NetworkChangeReceiver是继承BroadcastReceiver的内部类,用于处理逻辑,即我们的广播接收器
class NetWordChangeReceiver extends BroadcastReceiver{
@Override
public void onReceiver(Context context,Intent intent){
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActivityNetworkInfo();
//TODO
}
}
getSystemService()
方法用于获得ConnectivityManager,其是一个系统服务类,主管网络连接,通过它的getActivityNetworkInfo();
方法,得到NetworkInfo,NetworkInfo的常用方法有isAvailable()
,返回一个布尔值
在onCreate()
函数中注册广播
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
netWorkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(netWorkChangeReceiver,intentFilter);
registerReceiver()
方法的第一个参数是广播接收器,第二个参数就是带有Action的intentFilter,这样,广播接收器就可以接受到相应Action的广播
需要注意的是,为了节省用户电池的电量,动态注册的广播接收器在结束活动时必须取消注册
unregisterReceiver(netWorkReceiver);
在高版本的安卓里访问系统的状态需要声明权限,在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
静态注册主要用于在程序未启动的情况下接受广播
以接收开机广播为例,首先在AndroidManifest.xml加入
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
<receiver
android:name=".BootCompletedReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</intent-filter>
</receiver>
在相应的BootCompletedReceiver类中,只需要在onReceive()
方法中处理逻辑
以隐式的调用Intent的构造函数为例
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
Intent的参数,就是我们要发送的广播
注意:在安卓8.0及以上的系统中,必须显式地调用Intent的构造函数
Intent intent = new Intent(MainActivity.this,MyBroadcastReceiver.class);
intent.setAction("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
Intent的第一个参数是上下文,第二个参数是接收器的类
显然不能调用其他程序接收器的类,于是,在安卓8.0 以上,建议使用动态注册发送跨程序广播
有序广播只需要使用sendOrderdBroadcast()
方法即可
sendOrderdBroadcast(intent,null);
第二个参数是权限设置
在AndroidManifest.xml中可以配置有序广播的先后顺序
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
如果在MyBroadcastReceiver的onReceive()
方法中调用了abortBroadcast()
方法,则截断这条广播
本地广播使用LocalBroadcastManager来对广播进行管理,并提供了自有的发送和注册广播的方法
声明变量
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
localReceiver是继承BroadcastReceiver的内部类,用于处理逻辑,即我们的广播接收器
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceiver(Context context,Intent intent){
//TODO
}
}
而我们的主角LocalBroadcastManager,由于这是一个服务类,故通过getInstance()
方法获取实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
发送广播的方法唯一不同的是调用了LocalBroadcastManager的sendBroadcast()
方法
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
LocalBroadcastManager.sendBroadcast(intent);
同理,注册接收器也同样地使用LocalBroadcastManager的registerReceiver()
方法
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcast.MY_BROADCAST");
localReceiver = new LocalReceiver();
LocalBroadcastManager.registerReceiver(localReceiver,intentFilter);
不要忘了在结束程序的时候取消注册
LocalBroadcastManager.unregisterReceiver(netWorkReceiver);
标签:main enabled XML rmi 同步 cas gets 发送 逻辑
原文地址:https://www.cnblogs.com/hermitgreen/p/12650234.html