Android广播详解

来源:互联网 发布:python for循环遍历 编辑:程序博客网 时间:2024/04/30 03:06

简述:

    广播接收器,也被称为全局事件,或系统事件。在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听“,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。
    广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。

理论部分:

    广播机制的三要素:

        Android广播机制包含三个基本要素:
            1、广播(Broadcast) - 用于发送广播(并不是说Android中存在Broadcast实体类,其本质就是一个Intent意图);
            2、广播接收器(BroadcastReceiver) - 用于接收广播;
            3、意图内容(Intent)-用于保存广播相关信息的媒介。
        Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。

    广播的生命周期:

        1、广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态。
        2、拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死,但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。
        3、如果响应一个广播信息需要很长的一段时间,一般会将其纳入一个衍生的线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。

    广播的分类:

        根据是否跨进程,可分为全局广播和本地广播。
            全局广播:广播可以发送给不同进程,可以接收不同进程广播消息;
            本地广播:使用LocalBroadcastManager.getInstance(context).sendBroadcast发送本地广播
        使用本地广播相比全局广播有如下优势:
           1.保护隐私: 广播的数据不会离开当前进程,不用担心数据会泄露;
           2.安全: 其他应用不可能发送该广播给当前进程, 因此不用担心安全漏洞;

           3.效率: 与全局广播在整个系统传播相比,本地广播效率更高。

简单使用:

    全局广播

        现在简单的使用接收一个网络状态变化的广播。
        1、注册广播接收器:
广播接收器的注册有两种形式:隐式注册和显式注册,又或者叫静态注册和动态注册。注意一般的广播基本上两种都可以,但是有些是不行的,比如监听屏幕亮和熄屏的只能动态注册,Android N 以后网络状态的变化也只能动态注册。

隐式注册(静态注册):

<receiver    android:name=".NetChangeBroadcastReceiver"    android:exported="true"    android:permission="android.permission.ACCESS_NETWORK_STATE"    android:process=":remote">    <intent-filter android:priority="1000">        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />    </intent-filter></receiver>
xml属性:
    android:name:此broadcastReceiver类名;
        android:exported:此broadcastReceiver能否接收其他App的发出的广播,这个属性默认值有点意思,其默认值是由receiver中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。(同样的,activity/service中的此属性默认值一样遵循此规则)同时,需要注意的是,这个值的设定是以application或者application user id为界的,而非进程为界(一个应用中可能含有多个进程);
        android:permission :如果设置,具有相应权限的广播发送方发送的广播才能被此broadcastReceiver所接收;
        android:process  :broadcastReceiver运行所处的进程。默认为app的进程。可以指定独立的进程(Android四大基本组件都可以通过此属性指定自己的独立进程)。
        android:priority :在<intent-filter/>标签中可以设置该广播接收器的优先级,范围“-1000~1000”;
    显式注册(动态注册):

    @Overrideprotected void onResume() {    super.onResume();    NetChangeBroadcastReceiver netChangeBroadcastReceiver = new NetChangeBroadcastReceiver();    IntentFilter filter = new IntentFilter();    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");    filter.setPriority(1000);    MainActivity.this.registerReceiver(netChangeBroadcastReceiver,filter);}
      2、扩展BroadcastReceiver
public class NetChangeBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "网络状态发生改变", Toast.LENGTH_SHORT).show();        if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())){            ConnectivityManager connectivityManager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);            NetworkInfo mobNetInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);            NetworkInfo  wifiNetInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);            Toast.makeText(context, "网络变化了", Toast.LENGTH_SHORT).show();            if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {                Toast.makeText(context, "网络不可以用", Toast.LENGTH_SHORT).show();                //改变背景或者 处理网络的全局变量            }else {                //改变背景或者 处理网络的全局变量            }        }    }}
ok,这样一个全局广播接收就算写完了。

本地广播:

  本地广播的使用采用动态的注册方式,使用上面基本上遵循上述的步骤。具体的使用如下:
    1、发送本地广播:
     首先在Oncreate()方法中实例化一个LocalBroadcastManager 。
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
然后在来看发送本地广播的代码:
LocalBroadcastManager.getInstance(this);  private  void sendLocalBroadcastReceiver (){    Intent intent = new Intent();    intent.setAction("mylocalbroadcastReceiver");    intent.putExtra("local","这是一个本地广播!");    localBroadcastManager.sendBroadcast(intent);}
2、注册本地广播:
private void registerLocalBroadcast(){    receiver = new InnerBroadcastReceiver();    IntentFilter filter = new IntentFilter();    filter.addAction("mylocalbroadcastReceiver");    localBroadcastManager.registerReceiver(receiver,filter);}
3、扩展BrocastReceiver:
public class LocalBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        if ("mylocalbroadcastReceiver".equals(intent.getAction())){            String local = intent.getStringExtra("local");            Toast.makeText(context, local, Toast.LENGTH_SHORT).show();        }    }}
本地广播的使用就此完毕!!!

0 0
原创粉丝点击