从本质来说,Android 系统的广播机制是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息;而对 Android 应用程序来说,订阅消息其实就是注册广播接收器。
注册的方法有两种,一种是静态注册,一种是动态注册。在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。
先回顾一下静态注册。所谓注册,就是在 Manifest.xml 中去注册广播接收器。
然后再创建一个继承 BroadcastReceiver 得类即可。在这里要特意强调一下的是,intent-filter 标签中的 priority 是设置广播
接收器的优先级,网上很多资料都表示,优先级的设置数值为1000~-1000,1000最大,但事实上,当 priority 值为integer 的最大值才时,才是优先级最高的,即 2147483647;当然,“最高”只是限于静态注册。
了解更多关于静态注册信息,可参考《【Android】短信应用——短信信息实时获取》一文,其短信信息的获取就是运用了广播接收器的静态注册。
下面回到正题,如何动态注册广播接收器。
首先,我们来写一个内部类,继承 BroadcastReceiver。
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "myReceiver receive", Toast.LENGTH_SHORT)
.show();
}
};
onReveice 中我们写一个 Toast,稍后用来检测广播接收器是否成功注册。
下面来看看如何去注册广播接收器。
private static final String ACTION = "cn.etzmico.broadcastreceiverregister.SENDBROADCAST";
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION);
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(myReceiver, filter);
我们在注册的时候也来设置下优先级,正如上面文章提到的,用 Integer 的最大值来获得广播机制中的最高优先级。
广播注册完毕,下面就是来做测试,来检验广播接收器是否注册个成功。
sendBroadcast(new Intent(ACTION));
动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。
不过,我们可以通过将广播接收器在 Service 中动态注册,并设置开机自启动,这样一来,就不会担心像Activity一样的关闭问题了。但又如果要用“自启动管家”等带有管理开机自启动程序功能的软件讲相关自启动程序关闭时,广播接收器也就无法成功注册了。要想解决这个问题,就要看源码,是否能防止程序的自启动被关闭。另外,现市场上有没有程序能通过管理广播接收器来关闭静态注册的广播接收器,我还在调研,目前没有发现,如果有知道的,欢迎留言说明~谢谢!
后续的文章我会写一篇关于通过动态注册广播接收器方法来实现有最高优先级的短信拦截功能的文章。文章中会提到如何开机自启动 Service 和 用 Service 动态注册广播接收器,敬请关注!谢谢~
PS:之前附加的资源有一个小BUG,给大家带来了不便,不好意思!!!下面的链接是新上传的……没BUG的……I promise!
工程资源:http://download.csdn.net/detail/etzmico/4116111