Denua 博客

Android 中的广播机制

发布时间: 2017-12-08 22:53   分类 : 笔记    标签: Android 浏览: 643   


Android 中的广播机制使得应用程序之间交流数据更加灵活, 每个应用可以对自己感兴趣的广播进行注册, 或者是发送广播. 就像我们对我们感兴趣的博客进行 RSS 订阅, 这样我们就能接收到我们感兴趣的博客的最新动态, 或者别人订阅了我们的博客内容, 当我的博客有新内容的时候, 订阅者也能接收到. #### 简介 注册广播接收器(Boradcast Receiver), 可以接收自己感兴趣的广播 分类 - 标准广播(Normal broadcast), 完全异步执行的广播, 所有广播接收器同时接收到广播消息, 无先后顺序 - 有序广播(Ordered broadcast), 同步执行广播, 同一时刻只能有一个接收器接收消息 #### 接收系统广播 例如, 开机广播, 电量变化, 时间改变 **动态注册监听网络变化** 注册广播接收器, registerReceiver(BroadcastReceiver, IntentFilter) ``` private IntentFilter intentFilter; private NetworkChange receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); // 监听的广播的值 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); receiver = new NetworkChange(); // 注册广播接收器 registerReceiver(receiver, intentFilter); } protected void onDestroy(){ super.onDestroy(); // 注销, 动态注册的广播接收器必须注销 unregisterReceiver(receiver); } class NetworkChange extends BroadcastReceiver{ // 接收到广播 @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "network Changes", Toast.LENGTH_SHORT).show(); } } ``` 代码优化, 检查网络是否可用 ``` public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = connectivityManager.getActiveNetworkInfo(); if (info != null && info.isAvailable()) Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show(); else Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show(); } ``` 在这里, 查看系统网络状况需要注册权限, 在 AndroidMainifest.xml 中添加 ``` xml ``` **开机启动** 权限 ```xml ``` 注册静态广播接收器 ```xml ``` #### 发送自定义广播 **发送标准广播** 先定义一个接收器, ``` public class myBoradcastReceiver extends BroadcastReceiver{ public void onReceive(Context, context, Intent intent){ Toast(context, "Received", Toast.LENGTH_SHORT).show(); } } ``` 在 AndroidManifest.xml 中注册 ```xml * ``` 发送广播, 构造一个意图传入 sendBroadcast 将代码放入 Button 的 onClick 事件中当点击按钮时就会提示 Received ``` Intent intent = new Intent("com.example.broadcast.MY_BROADCAST"); sendBroadcast(intent); ``` **发送有序广播** 有序广播同一时间只能被一个接收器接收, 有序广播相比标准广播多了一个权限描述字符串, 可为空. ``` sendOrderedBroadcast(Intent intent, String receiverPermission) ``` intent-filter 中的 priority 表示接收到广播优先级. AndroidManifest.xml ```xml ``` 有序广播的截断 只需在广播接收器的 onReceive 中添 abortBroadcast(); 即可, 这样后面的广播接收器就无法接收到这条广播. ``` public void onReceive(Context context, Intent intent){ // do something abortbroadcast(); } ``` #### 本地广播 本地广播与全局广播不同, 本地广播只会在一个本应用中广播, 其他应用程序无法接收到. 本地广播通过 LocalBroadcastManager 进行管理, 发送和接收 . 首先定义一个广播接收器 ``` class LocalReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { // do something } } ``` 然后绑定, 注册广播接收器 ``` private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; private IntentFilter intentFilter; protected void onCreate(Bundle savedInstanceState){ ... localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例 intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); // 设置要监听广播的值 localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播接收器 } ``` 发送广播 ``` Intent intent = new Intent("com.example.broadcast.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); ``` (完)

评论    

demo [2018-01-11 15:44] : test

Copyright denua denua.cn