android广播使用注意

来源:互联网 发布:物资出入库软件 编辑:程序博客网 时间:2024/06/06 05:33

在某些场景下,应用内部进行数据传递需要使用到广播。使用广播进行数据传递必须注意以下几点:

1、 应用发送某个广播时,系统会将广播中的intent与系统中所有注册的BroadcastReceiver进行匹配,如果能匹配成功则调用相关的onReceive函数进行处理。
  
    这里存在2个问题: 
 a、性能问题。每个广播都会与所有BroadcastReceiver进行匹配。
     b、安全问题。广播发出去的数据可能被其他应用监听。
  
    解决方式:
 a、通过intent.setPackage指定包名,该广播只会被指定应用接收
 b、设置权限。指定广播的接收者必须具备对应的permission。  

2、 当应用注册了BroadcastReceiver之后,用来接收的广播。
 
    这里也存在2个问题:
 a、性能问题。系统有广播发送时会被用来与广播进行匹配判断。
 b、安全问题。外界可以通过发送大量指定action的方式进行暴力攻击。

    解决方式:
 a、动态注册的BroadcastReceiver可以设置发送者必须拥有指定的权限才能给它发送广播。
 b、静态注册的广播可以设置android:exported="false"来表示对外不可见,不接收外部广播。
 
当广播仅限于应用内部进行传递时,上面的问题都可以使用LocalBroadcastManager来解决。
Android v4 兼容包提供LocalBroadcastManager工具类,可以通过它来进行进程内的广播注册与发送,相比sendBroadcast(Intent)发送全局广播有如下好处:

1、 LocalBroadcastManager发送的广播只会在本应用内进行传递,不会存在隐私数据泄露的风险。
2、 不用担心外部伪造广播进行暴力攻击。
3、 更高效。

使用方式如下:
    private LocalBroadcastManager mlocalBroadcastManager = LocalBroadcastManager.getInstance(context);
   
    public void sendLocalBroadcast(Context context) {
  Log.d(TAG, "send localBroadcast");
        mlocalBroadcastManager.sendBroadcast(new Intent(ACTION_LOCAL));
    }
   
    public void registerLocalBroadcastReceiver(Context context) {
        Log.d(TAG, "register localBroadcastReceiver");
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_LOCAL);
        mlocalBroadcastManager.registerReceiver(localBroadcastReceiver, filter );
    }
   
    public void unregisterLocalBroadcastReceiver(Context context) {
        Log.d(TAG, "unregister localBroadcastReceiver");
        mlocalBroadcastManager.unregisterReceiver(localBroadcastReceiver);
    }

0 0