广播机制
动态注册
所谓动态注册是指注册逻辑是写在onCreate()中的,即必须要在程序启动之后才能接收到广播。
1.设置广播接收器。
class NetworkChangeReceiver extends BroadcastReceiver{
public void onReceive(Context context,Intent intent){
//得到connectionManager的实例,用来管理网络连接
ConnectivityManager connectionManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//得到networkInfo的实例
NetworkInfonetworkInfo=connectionManager.getActivityNetworkInfo();
//判断网络连接做出相应的反应
if(networkInfo!=null&&networkInfo.isAvailable()){
Toast.makeText(context,"networkis available",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,"networkis unavailable",Toast.LENGTH_SHORT).show();
}
}
}
2.发送广播
//在onCreate()外部定义
private IntentFilter IntentFilter;
private NetworkChangeReceiverNetworkChangeReceiver;
protected void onCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter=new IntentFilter();
//添加广播接收器要接收的广播
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
NetworkChangeReceiver=newNetworkChangeReceiver();
//注册广播,当接收到intentFilter里添加的广播消息时就开始执行NetworkChangeReceiver里的内容
registerReceiver(NetworkChangeReceiver,intentFilter);
}
3.动态注册的广播需要取消注册
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(NetworkChangeReceiver);
}
另:要访问系统网络状态需要添加权限
<user-permission android:name=”android.permission.ACCESS_NETWORK_STATE/>
静态注册
1.通动态注册需要写广播接收器,类名比如为BootCompleteReceiver()(在一个单独的文件直接通过android studio中实现创建广播文件)。
2.已自动在AndroidManifest.xml中注册完成,同时声明要发送的广播。
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
< intent-filter>
<action android:name="android.intent.action.BOOT_CONPLETED"/>
< /intent-filter>
</receiver>
3.相应的权限允许
<user-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED/>
发送标准广播
1.定义广播接收器,MyBroadcastReceiver() extends BroadcastReceiver.同上。
2.在AndroidManifest.xml中进行注册。
<receiver
android:name=".MyBroadcasrReceiver"
android:enabled="true"
android:exported="true">
< intent-filter>
action android:name="android.intent.action.MY_BROADCAST"
< /intent-filter>
</receiver>
3.发送广播。
Intent intent=newIntent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
发送有序广播
有序广播是指当同时有两个或两个以上的广播接收器接收的广播内容是一样的时候,有必要指定一下接收广播的顺序和要不要继续将广播传递下去。
1.设置优先级
<intent-filter android:priority=”100”>
<action android:name=" com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
2.发送广播方式
sendOrderedBroadcast(intent,null);
3.截断广播
abortBroadcast();
发送本地广播
前面所定义的广播是跨应用程序的,即发送的广播可以被其他应用接收,外部发送的广播也可以被我们的应用程序接收。本地广播是指广播的发送和接收在应用程序内部进行,使用的是动态注册的方式。
1.接收广播的内容同上是一样的
2.创建一个本地广播管理器,并获取实例
private localBroadcastManager localBroadcastManager;
localBroadcastManager =localBroadcastManager.getInstance(this);//获取实例
3.发送广播
LocalBroadcastManager.sendBroadcast(intent);//发送本地广播
4.注册本地广播监听器
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
5.取消广播的注册
protected void onDestroy(){
super.onDestroy();
localBroadcasrManager.unregisterReceiver(localReceiver);
}