Android:广播接收者BroadcastReceiver

广播接收者

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;
       设备墙纸已改变时发出的广播
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值