关闭

android 广播简介

标签: android
1094人阅读 评论(0) 收藏 举报
分类:

无序广播

特点:执行效率较高,发出去后能被不同应用 不同的广播接受者接受,不安全。

广播发送方式:

sendBroadcast(mIntent);//无序
广播接受者按生命周期分为动态注册的广播和静态注册的广播。

动态广播接受者注册:

动态注册的广播随着注册时的Context对象的销毁而销毁。也可以主动注销掉动态注册的广播接受者。

1.创建过滤器

IntentFilter filter = new IntentFilter();
        filter.addAction(LOCAL_ACTION);
2.创建广播接受者

BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (LOCAL_ACTION.equals(intent.getAction())) {
            
            }
        }
    };
3.注册动态广播

 registerReceiver(mReceiver, filter);
4.注销广播

 @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }


静态广播

只要设备开启,广播接受者就是打开的,不用担心广播接受者被挂掉。
1.继承实现BroadcastReceiver

public class LocalBroadReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (LOCAL_ACTION.equals(intent.getAction())) {
        }
    }
}
2.在清单中注册广播

  <receiver android:name="com.example.androiddemo.LocalBroadReceiver" >
              <intent-filter >
                <action android:name="com.test.localbroad" />
            </intent-filter>
        </receiver>


有序广播

特点:执行效率较低,发出的广播按照优先级的高低,从高到底依次传递,可以在传递的过程中消耗掉该广播不让较低优先级的广播接受者接受到该广播。

有序广播跟无序广播使用上最大的不同是,要为注册的广播接受者设置一个优先级。其他部分流程类似。

广播发送方式:

sendOrderedBroadcast(mIntent, null);

设置优先级

1.动态注册的广播接受者

IntentFilter filter = new IntentFilter();
        filter.addAction(LOCAL_ACTION);
        registerReceiver(mReceiver, filter);
        filter.setPriority(1000);//优先级
        registerReceiver(mReceiver, filter);
2.静态注册的广播接受者
  <receiver android:name="com.example.androiddemo.LocalBroadReceiver" >
              <intent-filter android:priority="500">
                <action android:name="com.test.localbroad" />
            </intent-filter>
        </receiver>


第一次接收到广播获取接收到的参数
使用 abortBroadcast();可以可以消耗掉该广播,不让广播继续向下传送。

Bundle bundle=intent.getExtras();
setResultExtras(bundle); 
接受上一层广播接受者分发的参数

//是否接受上一个广播接收器传来的的数据  
Bundle bundle=getResultExtras(true);  

在Android系统中,BroadcastReceiver的设计初衷就是从全局考虑的,可以方便应用程序和系统、应用程序之间、应用程序内的通信,所以对单个应用程序而言BroadcastReceiver是存在安全性问题的,相应问题及解决如下:
1、当应用程序发送某个广播时系统会将发送的Intent与系统中所有注册的BroadcastReceiver的IntentFilter进行匹配,若匹配成功则执行相应的onReceive函数。可以通过类似sendBroadcast(Intent, String)的接口在发送广播时指定接收者必须具备的permission。或通过Intent.setPackage设置广播仅对某个程序有效。
2.  当应用程序注册了某个广播时,即便设置了IntentFilter还是会接收到来自其他应用程序的广播进行匹配判断。对于动态注册的广播可以通过类似registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)的接口指定发送者必须具备的permission,对于静态注册的广播可以通过android:exported="false"属性表示接收者对外部应用程序不可用,即不接受来自外部的广播。

其实通过LocalBroadcastManager可以很好的解决这些问题。

LocalBroadcastManager

特点:执行效率高,用来在同一个应用的不同组件间发送广播。
Android v4 兼容包提供android.support.v4.content.LocalBroadcastManager工具类,主要负责程序内部广播的注册与发送。也就是说,它只是适用代码中注册发送广播,对于在AndroidManifest中注册的广播接收,则不适用。使用它比直接通过sendBroadcast(Intent)发送系统全局广播有以下几点好处。
  • 1.因广播数据在本应用范围内传播,你不用担心隐私数据泄露的问题。
  • 2.不用担心别的应用伪造广播,造成安全隐患。
  • 3.相比在系统内发送全局广播,它更高效。
使用过程:
1.获取LocalBroadcastManager实例
LocalBroadcastManager mLocal;
        mLocal = LocalBroadcastManager.getInstance(this);
2.发送广播
mLocal.sendBroadcast(mIntent);
3.注册广播接受者
 IntentFilter filter = new IntentFilter();
        filter.addAction(LOCAL_ACTION);
        mLocal.registerReceiver(mReceiver, filter);
4.注销
mLocal.unregisterReceiver(mReceiver);


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:794726次
    • 积分:7987
    • 等级:
    • 排名:第2549名
    • 原创:207篇
    • 转载:3篇
    • 译文:0篇
    • 评论:184条
    最新评论