zoukankan      html  css  js  c++  java
  • Broadcast

    Broadcast

    广播是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 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);
    
  • 相关阅读:
    微支付开发(.net)
    微信公众平台开发(一) 配置接口
    [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天
    [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
    [038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应
    [037] 微信公众帐号开发教程第13篇-图文消息全攻略
    【微网站开发】之微信内置浏览器API使用
    .Net(c#)汉字和Unicode编码互相转换
    jquery.uploadify上传文件配置详解(asp.net mvc)
    微信公众平台入门开发教程.Net(C#)框架
  • 原文地址:https://www.cnblogs.com/hermitgreen/p/12650234.html
Copyright © 2011-2022 走看看