android 广播知识点

来源:互联网 发布:java新闻发布系统源码 编辑:程序博客网 时间:2024/06/03 17:32
  如果你不想发送广播给其他应用程序,可以使用LocalBroadcastManager本地广播来代替普通广播。这将有效避免其他应用程序接受或者发送你的广播。

一、广播的注册方式
  1、动态注册
即在代码中对广播进行注册。通过Context.registerReceiver()语句进行注册,并且在onDestory()方法里进行取消注册unregisterReceiver()。

缺点:必须在程序启动后才能接受到广播,因为注册的逻辑是写在onCreate()方法中的。

  2、静态注册
即在AndroidManifest.xml里面通过<receiver>标签进行注册。

        注意:如果在Activity.onResume()中注册广播,则应该在onPause()中取消注册。

二、广播的类型
  1、标准广播(发送 Context.sendBroadcast)
是一种完全异步的广播。在广播发出后,所有的广播接收器在相同时间收到这条消息。

  2、有序广播(发送 Context.sendOrderedBroadcast)
有序广播是分先后顺序的,优先级高的先接收到广播。并且可以对广播进行拦截。

三、广播安全问题
  广播有可能被其他应用所利用,所以需要考虑安全问题:

1、确保广播的命名是独一无二的,不能与其他应用程序冲突。

2、在使用registerReceiver(BroadcastReceiver, IntentFilter)注册广播的时候,其他应用程序可能发送广播给你的应用,所以应该设置如下权限:
a.为了阻止其他应用程序发送给本应用程序广播,应该设置 android:exported="false"属性,拒绝外部进程发送来的广播。
b.在你使用sendBroadcast(Intent) 或者是相关方法来发送广播的时候,其他的应用程序可能接收到此广播,所以可以使用 LocalBroadcastManager(本地广播)来对广播进行发送,这样发送的广播不会跳出应用程序。本地广播是无法通过静态注册的方式来接收的。

本地广播的优势是:广播不会离开本应用程序。其他程序的广播进不来。本地广播效率更高。

3、当发送带权限的广播的时候( sendBroadcast(Intent, String)或者sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)),广播接收器应该在AndroidManifest.xml的 <uses-permission>标签下声明该权限,否则会收不到此广播。

4、当注册广播接受器时声明了权限(registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler) 或者在 <receiver>标签下声明了权限),则只有声明了相应权限的广播才能够发送给接收器。

在广播接收器中,如果要执行长时间的后台程序,建议使用Service而不是子线程。因为在BroadCastReceiver被回收后,在它内部开启的线程就成了空线程,在设备空闲的时候没有影响,一旦发生运行资源不足,这些空线程就会被系统回收,导致线程中的任务无法完全执行,从而影响线程执行。所以在广播接收器中,避免开启线程,而应使用服务来进行长时间的运行。

0 0
原创粉丝点击