Android广播接收器是android四大组件之一,而广播又分为两种:有序广播和标准广播。
标准广播是一种异步执行的广播,在广播发出后所有接收器都会同步收到该广播,而且过程无法拦截。 有序广播是一种同步执行的广播,在广播发出后同意时刻只有一个广播接收器接收到广播,执行完逻辑才能继续往下传递,所以广播是有先后顺序的。
我们可以通过接收系统广播来监视系统状态,从而完成一些列活动,下面是动态监听网络变化的例子,应用场景是网络下载网络切换时的提示,或者QQ断网时的提醒
下面是模仿QQ断网提示的效果(没有基于QQ demo制作,所以仅仅是简单的显示隐藏和跳转)
1.效果图 2.达到的效果是:当无线网络或者移动数据接入的时候,黄色提示条消失,对网络种类进行提示,当断开网络时,黄色提示条显示,点击提示条进入设置界面。 3.java代码
首先变量定义和实例的获取就不写出来了,下面再onCreate方法里新建 netset()方法,内容如下
private void netset() { intentfilter=new IntentFilter(); intentfilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkchange=new NetworkChange(); registerReceiver(networkchange,intentfilter); }用来监听,其中NetworkChange方法是我们新创建的,所以下面给出他的声明 此方法继承自BroadcastReceiver,重写其中的方法
class NetworkChange extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mobNetInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifiNetInfo=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) { text.setText("网络未连接"); //修改文本内容 net.setVisibility(View.VISIBLE); //显示黄色框 net.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Settings.ACTION_SETTINGS); //打开设置界面 startActivity(intent); } }); //黄色框事件 }else if(wifiNetInfo.isConnected()) { text.setText("无线网络已连接"); //设置文本 net.setVisibility(View.GONE); //取消显示黄色框 }else if(mobNetInfo.isConnected()) { text.setText("移动数据已连接"); net.setVisibility(View.GONE); } } }最后别忘了注册和取消 下面是取消广播
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkchange); }注册权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>QQ的黄色框实现方法也是类似的吧,反正不管实现方法如何,最终都可以达到广播接收提示的功能
然后获取系统电量的做法是和获取网络状态类似的
private void battry() { IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); batteryReceiver = new BatteryReceiver(); registerReceiver(batteryReceiver, intentFilter); }上面是电池方法
class BatteryReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //如果电量发生变化变化 if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){ //获取当前电量 int level = intent.getIntExtra("level", 0); //设置总量 int scale = intent.getIntExtra("scale", 100); //转成百分比 low.setText("电池电量为"+((level*100)/scale)+"%"); } } }上面是电量获取
protected void onDestroy() { super.onDestroy(); unregisterReceiver(batteryReceiver); }取消
电量读取的话不用申请权限 下面是效果图
说到获取手机网络和电池信息,我想补充一点,获取手机的版本号信息是不用广播的,只需要固定的量就可以取的 android.os.Build.MODEL:手机型号 android.os.Build.VERSION.SDK:SDK版本 android.os.Build.VERSION.RELEASE :系统版本号 这些值运行的时候都会根据手机自身情况赋值,直接输出就可以获取到手机信息 效果:
动态注册的前提是程序要启动,如果程序不启动那么就没办法接收到广播,于是有了静态注册。 静态注册可以在程序未启动的时候产生,下面是实现开机自启的例子。
新建一个接收器BootReceiver继承自BroadcastReceiver 内容如下
public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent start = new Intent(context, MainActivity.class); start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(start); } }接收器负责接收指令完成开机启动的动作 在清单文件里注册开机启动权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />注册广播接收器
<receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.HOME"/> </intent-filter> </receiver>好了,运行在手机上给应用权限,重启实现了开机自启效果,在 onReceive方法里不允许添加耗时操作,同时广播接收器效率不是很高,所以一般在恰当的地方才会用到。