Android学习总结(五)———— BroadcastReceiver(广播接收器)的基本概念和两种注册广播方式
2017-03-08 13:10
531 查看
我们学完了Android四大组件的Activity和Service了,接下来我们一起来学习Android四大组件的第三个吧:BroadcastReceiver(广播接收者),计划如下图:
其实BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,程序就只会接收到自己所关心的广播内容,这些广播可能来自于系统,也可能来自于其他应用程序。比如电量低或者充足,刚启动完,插入耳机,输入法改变等, 发生这些事件,系统都会发送广播,这个叫系统广播,每个APP都会收到,如果你想让你的应用在接收到 这个广播的时候做一些操作,比如:系统开机后,偷偷后台跑服务,这个时候你只需要为你的应用 注册一个用于监视开机的BroadcastReceiver,当接收到开机广播就做些偷偷摸摸的勾当。
广播的动态注册就是在java代码中指定IntentFilter,然后添加不同的Action即可,想监听什么广播就写什么Action,另外动态注册的广播,一定要调用unregisterReceiver()这个方法,让广播取消注册。
在onReceive()方法中完成广播要处理的事务,比如这里的提示Toast信息,如下:
代码注释得很详细,现在运行一下程序,先把网络给关了,效果图如下:
2.2 静态注册实现开机启动
动态注册需程序启动后才能接受到广播,静态广播就弥补了这个短板,在AndroidManifest.xml中制定<IntentReceiver>就可以让程序在未启动的情况下接受到了广播。
程序接收一条开机广播,当收到这个广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。代码如下:
在AndroidManifest.xml中对该BroadcastReceiver进行注册,添加开机广播的intent-filter!对了,别忘了加上android.permission.RECEIVE_BOOT_COMPLETED的权限哦!
把App安装到手机上,安装好之后我们的程序就可以接收开机广播了,为了看到效果,我把我的手机重新启动,当手机重新启动开机完毕后,我们的App就会收到系统的开机广播,弹出一个"开机完毕"的toast消息,效果如下:
这就是表示我们的App已经自动启动运行了。
一.BroadcastReceiver的基本概念
举个形象的例子来理解下BroadcastReceiver,记得以前读书 的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如,开学要去搬书,广播: "每个班级找几个同学去教务处拿书",发出这个广播后,所有同学都会在同一时刻收到这条广播通知, 收到,但不是每个同学都会去搬书,一般去搬书的都是班里的"大力士",这群"大力士"接到这条 广播后就会动身去把书搬回可是!其实BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,程序就只会接收到自己所关心的广播内容,这些广播可能来自于系统,也可能来自于其他应用程序。比如电量低或者充足,刚启动完,插入耳机,输入法改变等, 发生这些事件,系统都会发送广播,这个叫系统广播,每个APP都会收到,如果你想让你的应用在接收到 这个广播的时候做一些操作,比如:系统开机后,偷偷后台跑服务,这个时候你只需要为你的应用 注册一个用于监视开机的BroadcastReceiver,当接收到开机广播就做些偷偷摸摸的勾当。
二.广播的使用示例
2.1 动态注册监听网络变化广播的动态注册就是在java代码中指定IntentFilter,然后添加不同的Action即可,想监听什么广播就写什么Action,另外动态注册的广播,一定要调用unregisterReceiver()这个方法,让广播取消注册。
在onReceive()方法中完成广播要处理的事务,比如这里的提示Toast信息,如下:
package com.nyl.broadcasttest; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends Activity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建IntentFilter的实例 intentFilter = new IntentFilter(); /** * 当网络状态发生变化时,系统发出的正是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播 * 也就是我们广播接收器想要监听什么广播,在这里添加相对应的Action就行了 */ intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); /** * 实例化NetworkChangeReceiver的实例和IntentFilter的实例都传了进去, * NetworkChangeReceiver就会收到所有值为android.net.conn.CONNECTIVITY_CHANGE的广播, * 也就实现了监听网络变化的功能 */ networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver,intentFilter); } /** * 动态注册的广播接收器一定都要取消注册才行,这里是在onDestroy()方法中通过调用 * unregisterReceiver()方法来实现的 */ @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); } //定义一个广播,继承自BroadcastReceiver private class NetworkChangeReceiver extends BroadcastReceiver{ /** * 重写了父类的onReceive()方法, * 每当网络请求发生变化时,onReceive()方法就会得到执行 * @param context * @param intent */ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"没有网络,请连接网络!",Toast.LENGTH_SHORT).show(); } } }
代码注释得很详细,现在运行一下程序,先把网络给关了,效果图如下:
2.2 静态注册实现开机启动
动态注册需程序启动后才能接受到广播,静态广播就弥补了这个短板,在AndroidManifest.xml中制定<IntentReceiver>就可以让程序在未启动的情况下接受到了广播。
程序接收一条开机广播,当收到这个广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。代码如下:
package com.nyl.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class BootCompleteReceiver extends BroadcastReceiver{ private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) { if (ACTION_BOOT.equals(intent.getAction())){ Toast.makeText(context,"开机完毕",Toast.LENGTH_SHORT).show(); } } }
在AndroidManifest.xml中对该BroadcastReceiver进行注册,添加开机广播的intent-filter!对了,别忘了加上android.permission.RECEIVE_BOOT_COMPLETED的权限哦!
把App安装到手机上,安装好之后我们的程序就可以接收开机广播了,为了看到效果,我把我的手机重新启动,当手机重新启动开机完毕后,我们的App就会收到系统的开机广播,弹出一个"开机完毕"的toast消息,效果如下:
这就是表示我们的App已经自动启动运行了。
相关文章推荐
- 【重头学习Android】关于广播的两种方式
- android中两种广播注册方式
- Android 编程下两种方式注册广播的区别
- Android 编程下两种方式注册广播的区别
- Android注册广播两种方式的区别
- Android 注册广播的两种方式区别
- Android 广播注册的两种方式
- Android 注册广播的两种方式对比
- android注册广播的两种方式与区别
- Android 编程下两种方式注册广播的区别
- Android 注册广播的两种方式区别
- Android 编程下两种注册广播方式的区别
- 转 Android 编程下两种方式注册广播的区别
- android注册广播的两种方式及优缺点
- Android BroadCast 广播的两种注册方式和粘性广播实现
- Android广播的两种注册方式及其区别
- Android 的广播机制和两种注册方式
- Android 注册广播的两种方式区别
- Android 注册广播的两种方式区别
- Android 编程下两种方式注册广播的区别