【Android】动态注册广播接收器

       从本质来说,Android 系统的广播机制是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息;而对 Android 应用程序来说,订阅消息其实就是注册广播接收器。

    注册的方法有两种,一种是静态注册,一种是动态注册。在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。


    先回顾一下静态注册。所谓注册,就是在 Manifest.xml 中去注册广播接收器

 <receiver android:name="" >
            <intent-filter android:priority="2147483647" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" >
                </action>
            </intent-filter>
        </receiver>
    然后再创建一个继承 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

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
好的,您可以使用以下代码动态注册广播接收器,监听网络变化: 首先,在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ``` 然后,创建一个 BroadcastReceiver 类,用于接收网络变化的广播: ```java public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 获取网络连接管理器 ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { // 获取当前活跃的网络信息 NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { // 网络已连接 Toast.makeText(context, "网络已连接", Toast.LENGTH_SHORT).show(); } else { // 网络断开 Toast.makeText(context, "网络已断开", Toast.LENGTH_SHORT).show(); } } } } ``` 最后,在需要监听网络变化的 Activity 或 Service 中,动态注册广播接收器: ```java NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkChangeReceiver, intentFilter); ``` 注意,当不再需要监听网络变化时,应该及时取消注册广播接收器: ```java unregisterReceiver(networkChangeReceiver); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值