广播分为普通(无序)广播,有序广播,粘性广播,本地广播,系统广播。
广播的三要素:广播发送者(发送广播)
广播接收者(调频,接收广播)
要处理的事情(处理广播的相关信息,Intent有图对象)
创建:
一.普通广播
普通广播又叫无序广播,在接收时,所有广播接收器几乎会在同一时刻接收到广播。
普通广播需要在清单文件中增加过滤器
普通广播的应用():
//注册静态广播
Intent intent = new Intent();
// intent.setPackage(getPackageName());
//如果版本为8.0以上,需要加上述代码
intent.setAction("com.bw.sta");
Bundle bundle = new Bundle();
bundle.putString("name","");
bundle.putInt("age","");
bundle.putFloat("money","");
intent.putExtras(bundle);
sendBroadcast(intent);
广播的继承(在广播传值的时候可以使用Bundle传值):
public class MyStaticReceiver extends BroadCastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("com.bw.sta")){
Bundle bundle = intent.getExtras();
String name = bundle.getString(“name”);
int age = bundle.getInt(“age”);
float money = bundle.getFloat(“money”);
}
}
}
二.有序广播
有序广播的接收在同一时刻只会有一个接收者接收到消息。
同理,在应用动态广播的时候在Activity中进行编译同样需要继承
//注册动态广播
MyDynReceiver myDynReceiver =new MyDynReveiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.bw.dyn");
//动态广播需要注册
registerReceiver(myDynReceiver,intentFilter);
需要调用sendOrderedBroadcast()进行传值,接收时与其无异。
sendOrderedBroadcast(intent,null);
intentFilter.setPriority()为动态广播设置优先级的选择。
//设置的值为-1000到1000
intentFilter.setPriority(100);
registerReceiver(oneReceiver,intentFilter);
intentFilter.setPriority(200);
registerReceiver(twoReceiver,intentFilter);
4.abortBroadCast:阻止其他接收者接收这条广播,只对有序广播有效。
三.粘性广播
而粘性广播的传值传递
需要调用sendStickyBroadcast()进行传值并添加权限,接收时与其无异。
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
需注意:粘性广播的区别在于能(1)一直保存最后一条广播,(2)并一直滞留,(3)而且可以被多次接收。
四.本地广播
本地广播的优缺点:发送的广播只能在本应用程序内部进行传递,并且广播接收器也只能接收本应用程序的广播,但保证安全的同时也加大了局限性,只能在本应用程序中使用。
注册一个本地广播并发送出去
localBroadcastManager=LocalBroadcastManager.getInstance(this);
localBroadcastManager.sendBroadcast(new Intent("com.bw.local"));
注意事项:
本地广播无法通过静态注册来接收
在广播中启动活动需要添加FLAG_ACTIVITY_NEW_TASK的标记
在广播中弹出AlertDialog需要添加TYPE_SYSTEM_ALERT
五.系统广播
一些常用的系统广播
监听网络变化 | android.net.conn.CONNECTIVITY_CHANGE |
关闭或打开飞行模式 | Intent.ACTION_AIRPLANE_MODE_CHANGED |
充电时或电量发生变化 | Intent.ACTION_BATTERY_CHANGED |
系统启动完成后(仅广播一次) | Intent.ACTION_BOOT_COMPLETED |
电池电量低 | Intent.ACTION_BATTERY_LOW |
电池电量充足(即从电量低变化到饱满时会发出广播) | Intent.ACTION_BATTERY_OKAY |
按下照相时的拍照按键(硬件按键)时 | Intent.ACTION_CAMERA_BUTTON |
屏幕锁屏 | Intent.ACTION_CLOSE_SYSTEM_DIALOGS |
设备当前设置被改变时(界面语言,设备方向等) | Intent.ACTION_CONFIGURATION_CHANGED |
插入耳机时 | Intent.ACTION_HEADSET_PLUG |
未正确移除SD卡但已取出来时(正确移除方法:设置-SD卡和设备内存-卸载SD卡) | Intent.ACTION_MEDIA_BAD_REMOVAL |
插入外部存储装置(如SD卡) | Intent.ACTION_MEDIA_CHECKING |
成功安装apk | Intent.ACTION_PACKAGE_ADDED |
成功删除apk | Intent.ACTION_PACKAGE_REMOVED |
重启设备 | Intnet.ACTION_REBOOT |
屏幕被关闭 | Intent.ACTION_SCREEN_OFF |
屏幕被打开 | Intent.ACTION_SCREEN_ON |
关闭系统时 | Intent.ACTION_SHUTDOWN |
注:
在使用前需要在清单文件中加入并进行版本判断
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
六.注意事项
广播中不允许开辟线程
onReceiver()运行时间超过10秒 还没有结束程序会报错。
3.最后结束时在OnDestroy中销毁广播即可,如果不主动销毁则容易出现异常,则可能导致已经注册的receiver没有在合适的时机注销,导致内存泄漏,占用内存空间,加重 SystemService负担。
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver();
}