Denua 博客

Android 中的广播机制

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

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 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

开机启动

权限

xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

注册静态广播接收器

xml <receiver android:name=".BootCompleteReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

发送自定义广播

发送标准广播

先定义一个接收器,

public class myBoradcastReceiver extends BroadcastReceiver{ public void onReceive(Context, context, Intent intent){ Toast(context, "Received", Toast.LENGTH_SHORT).show(); } }

在 AndroidManifest.xml 中注册

xml <receiver android:name=".myBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.broadcast.MY_BROADCST"/> *</intent-filter> </receiver>

发送广播, 构造一个意图传入 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 <receiver android:name='' ...> <intent-filter android:priority="100"> <action .../> </intent-filter> </receiver>

有序广播的截断

只需在广播接收器的 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