android的四大组件之一,可以跨应用的传递信息,每一个应用都可以发送和接受广播,并且对自己感兴趣的广播进行注册。
标准广播(无序广播)
有序广播
创建广播接收者需要用到BroadcastReceiver类,实现onReceive方法,在该方法呢,我们可以获取广播内包含的Intent中的数据
public class Broadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//创建号BroadcastReceiver类,然后在清单文件中注册
}
}
priority是用来指定优先级的,优先级由小到大,最大为2147483647(2的32次方)最小为-2147483647。
intent-filter内静态注册广播,比如
<action android:name="android.intent.action.MY_BROADCAST" />
动态注册用到了android.content.ContextWrapper类下的registerReceiver方法,不过用动态注册需要在Activity或者Service销毁的时候解除注册:unregisterReceiver(broadcast);不然会报错。
以下是动态注册的案例代码
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private Broadcast broadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建intentFilter实例,以及BroadcastService实例
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
broadcast = new Broadcast();
//registerReceiver的第一个参数为BroadcastService实例,第二个为intentFilter实例
registerReceiver(broadcast,intentFilter);
}
还有销毁时解除注册:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broadcast);
}
这就完成了动态注册
public class Broadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if(networkInfo!=null && networkInfo.isAvailable()){
Toast.makeText(context,"网络有了",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context,"网络没了",Toast.LENGTH_LONG).show();
}
}
}
发送广播分为有序广播和无序广播(普通广播),
无序广播即为我们平时经常使用的广播,无序广播不指定接受者,对于接受者来说完全是异步的,接受者间相互无法影响,无法停止和修改广播(这些有序广播都可以)
Intent broadcastA = new Intent("myBroadcastA");
broadcastA.putExtra("message","无序广播的一条数据");
//sendBroadcast这个方法用来发送无序广播
sendBroadcast(broadcastA);
这样无序广播就发送完成了,接收方只要注册该广播名称就可以接收到
有序广播顾名思义会被有序的接收,接受者根据注册时的android:priority优先级大小顺序接收,并且,有序广播可以被拦截,被修改,被终止。
Intent intent = new Intent("newBroadcast");
intent.putExtra("message","有序广播的一种形式");
//第一个参数是intent实例,第二个参数是接受者权限
sendOrderedBroadcast(intent,null);
public class Broadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取接收到的有序广播的数据
String resultData = getResultData();
//打印接收到的有序广播的数据
System.out.println(resultData);
setResultData("此处为修改后的数据");
}
}
有序广播由优先级高的人先接收,然后在说优先级低的接受者,期间高优先级的接受者可以修改数并且拦截中断广播
//中断广播
abortBroadcast();
一些系统广播
1.Intent.ACTION_AIRPLANE_M;
关闭或打开飞行模式时的广播
2.Intent.ACTION_BATTERY_CH;
(1)充电状态,或者电池的电量发生变化;
(2)电池的充电状态、电荷级别改变,不能通过组建声;
3.Intent.ACTION_AIRPLANE_MODE_CHANGED;
关闭或打开飞行模式时的广播
4.Intent.ACTION_BATTERY_CHANGED;
(1)充电状态,或者电池的电量发生变化
(2)电池的充电状态、电荷级别改变,不能通过组建声明 接收这个广播,只有通过registerReceiver()注册
5.Intent.ACTION_BATTERY_LOW;
表示电池电量低
6 .Intent.ACTION_BATTERY_OKAY;
表示电池电量充足,即从电池电量低变化到饱满时会发出广播
7.Intent.ACTION_BOOT_COMPLETED;
在系统启动完成后的广播,这个动作被广播一次(只有一次)。
8.Intent.ACTION_CAMERA_BUTTON;
按下照相时的拍照按键(硬件按键)时发出的广播
9.Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android系统都会广播此Action消息
10.Intent.ACTION_CONFIGURATION_CHANGED;
设备当前设置被改变时发出的广播(包括的改变:界面语言,设备方向,等,请参考Configuration.java)
11.Intent.ACTION_DATE_CHANGED;
设备日期发生改变时会发出此广播
12.Intent.ACTION_DEVICE_STORAGE_LOW;
设备内存不足时发出的广播,此广播只能由系统使用,其它APP不可用
13.Intent.ACTION_DEVICE_STORAGE_OK;
设备内存从不足到充足时发出的广播,此广播 只能由系统使用,其它APP不可用
14.Intent.ACTION_DOCK_EVENT;
发出此广播的地方
frameworks\base\services\java\com\android\server\DockObserver.java
15.Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
移动APP完成之后,发出的广播(移动是指:APP2SD)
16.Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
正在移动APP时,发出的广播(移动是指:APP2SD) 17.
17.Intent.ACTION_GTALK_SERVICE_CONNECTED;
Gtalk已建立连接时发出的广播
18.Intent.ACTION_GTALK_SERVICE_DISCONNECTED;
Gtalk已断开连接时发出的广播
19.Intent.ACTION_HEADSET_PLUG;
在耳机口上插入耳机时发出的广播
20.Intent.ACTION_INPUT_METHOD_CHANGED;
改变输入法时发出的广播
21.Intent.ACTION_LOCALE_CHANGED;
设备当前区域设置已更改时发出的广播
22.Intent.ACTION_MANAGE_PACKAGE_STORAGE;
表示用户和包管理所承认的低内存状态通知应该开始。
23. Intent.ACTION_MEDIA_BAD_REMOVAL;
未正确移除SD卡(正确移除SD卡的方法:设置–SD卡和设备内存–卸载SD卡),但已把SD卡取出来时发出的广播 ,扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mountpoint) 还没解除 (unmount)
24.Intent.ACTION_MEDIA_BUTTON;
按下”Media Button” 按键时发出的广播,假如有”Media Button” 按键的话(硬件按键)
25. Intent.ACTION_MEDIA_CHECKING;
插入外部储存装置,比如SD卡时,系统会检验SD卡,此时发出的广播。
26.Intent.ACTION_MEDIA_EJECT;
已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都会发出此广播, 用户想要移除扩展介质(拔掉扩展卡)。
27.Intent.ACTION_MEDIA_MOUNTED;
插入SD卡并且已正确安装(识别)时发出的广播, 扩展介质被插入,而且已经被挂载。
28.Intent.ACTION_MEDIA_NOFS;
拓展介质存在,但使用不兼容FS(或为空)的路径安装点检查介质包含在Intent.mData领域。
29. Intent.ACTION_MEDIA_REMOVED;
外部储存设备已被移除,不管有没正确卸载,都会发出此广播, 扩展介质被移除。
30.Intent.ACTION_MEDIA_SCANNER_FINISHED;
广播:已经扫描完介质的一个目录
31.Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;
请求媒体扫描仪扫描文件并将其添加到媒体数据库。
32.Intent.ACTION_MEDIA_SCANNER_STARTED;
广播:开始扫描介质的一个目录
33. Intent.ACTION_MEDIA_SHARED;
广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。
34.Intent.ACTION_MEDIA_UNMOUNTABLE;
35.Intent.ACTION_MEDIA_UNMOUNTED
广播:扩展介质存在,但是还没有被挂载 (mount)
36.Intent.ACTION_NEW_OUTGOING_CALL;
37. Intent.ACTION_PACKAGE_ADDED;
(1)成功的安装APK之后
(2)广播:设备上新安装了一个应用程序包。
(3)一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)
38.Intent.ACTION_PACKAGE_CHANGED;
一个已存在的应用程序包已经改变,包括包名
39.Intent.ACTION_PACKAGE_DATA_CLEARED;
(1)清除一个应用程序的数据时发出的广播(在设置--应用管理--选中某个应用,之后点清除数据时?)
(2)用户已经清除一个包的数据,包括包名(清除包程序不能接收到这个广播)
40.Intent.ACTION_PACKAGE_INSTALL;
触发一个下载并且完成安装时发出的广播,比如在电子市场里下载应用?
41.Intent.ACTION_PACKAGE_REMOVED;
成功的删除某个APK之后发出的广播, 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)
42.Intent.ACTION_PACKAGE_REPLACED;
替换一个现有的安装包时发出的广播(不管现在安装的APP比之前的新还是旧,都会发出此广播?)
43.Intent.ACTION_PACKAGE_RESTARTED;
用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)
44.Intent.ACTION_POWER_CONNECTED;
插上外部电源时发出的广播
45.Intent.ACTION_POWER_DISCONNECTED;
已断开外部电源连接时发出的广播
46.Intent.ACTION_PROVIDER_CHANGED;
47.Intent.ACTION_REBOOT;
重启设备时的广播
48.Intent.ACTION_SCREEN_OFF;
屏幕被关闭之后的广播
49. Intent.ACTION_SCREEN_ON;
屏幕被打开之后的广播
50.Intent.ACTION_SHUTDOWN;
关闭系统时发出的广播
51. Intent.ACTION_TIMEZONE_CHANGED;
时区发生改变时发出的广播
52.Intent.ACTION_TIME_CHANGED;
时间被设置时发出的广播
53.Intent.ACTION_TIME_TICK;
广播:当前时间已经变化(正常的时间流逝), 当前时间改变,每分钟都发送,不能通过组件声明来接收 ,只有通过Context.registerReceiver()方法来注册
54. Intent.ACTION_UID_REMOVED;
一个用户ID已经从系统中移除发出的广播
55. Intent.ACTION_UMS_CONNECTED;
设备已进入USB大容量储存状态时发出的广播?
56.Intent.ACTION_UMS_DISCONNECTED;
设备已从USB大容量储存状态转为正常状态时发出的广播?
57.Intent.ACTION_USER_PRESENT;
58.Intent.ACTION_WALLPAPER_CHANGED;
设备墙纸已改变时发出的广播