Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接受自己所关心的中制广播内容,这些广播内容可能是播机来自于系统,也可能是详解来自于其他应用程序的;
Android 提供了一整套的 API,允许应用程序自由地发送和接受广播
今天我们就来详细介绍下
Android 内置了很多系统级别的广播,我们可以在应用中通过监听这些广播来得到各种系统的状态信息。比如手机开机后会发送一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条广播等等;
注册广播方式一般有两种:
动态注册在代码中注册;
静态注册在 AndroidManifest.xml 中注册
一般为常驻广播,在AndroidManifest.xml里通过
- <receiver android:name=".MyBroadcastReceiver" android:exported="true">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED"/>
- <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
- </intent-filter>
- </receiver>
intent过滤器里指定的是接收器订阅的action;
非常驻广播,在使用时注册,用完及时销毁;
- BroadcastReceiver br = new MyBroadcastReceiver();
- IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
- filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- this.registerReceiver(br, filter);
记得及时注销,以免内存泄漏;
- @Override
- protected void onDestroy() {
- super.onDestroy();
- unregisterReceiver(receiver);
- }
注册广播
- <receiver
- android:name=".test.MyBroadcastReceiver"
- android:enabled="true"
- android:exported="true">
- <intent-filter>
- <action android:name="com.test.test" />
- </intent-filter>
- </receiver>
- public class MyBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Toast.makeText(context,"发送标准广播",Toast.LENGTH_LONG).show();
- }
- }
- Intent intent = new Intent("com.test.test");
- sendBroadcast(intent);
- //发送有序广播
- Intent intent = new Intent("com.test.test");
- sendOrderedBroadcast(intent,null);
我们发送和接受的广播全部属于系统全局广播,即发出的广播可以被其它任何应用程序接收到,并且我们也可以接受来自于其它任何应用程序的广播;
为了解决广播安全性问题,Android 引入了一套本地广播机制,使用这个机制发出的广播只能在应用程序内部进行传递,并且广播接受器也只能接受来自本应用程序发出的广播,这样所有的安全性问题就都不存在了;
初始化广播:
- private LocalBroadcastManager localBroadcastManager;
- private void init() {
- //获取实例
- localBroadcastManager = LocalBroadcastManager.getInstance(this);
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction("om.test.LOCAL_BROADCAST");
- LocalReceiver localReceiver = new LocalReceiver();
- localBroadcastManager.registerReceiver(localReceiver, intentFilter);
- }
- Intent intent = new Intent("om.test.LOCAL_BROADCAST");
- localBroadcastManager.sendBroadcast(intent);
- 定义
- private class LocalReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Toast.makeText(context, "本地广播.....", Toast.LENGTH_LONG).show();
- }
- }
优点:
发广播
当调用sendBroadcast(Intent, String)或sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)时,可以指定权限参数;
- sendBroadcast(new Intent("com.test"),
- Manifest.permission.SEND_SMS);
要想接收这个广播,那么这个接收的app必须申请该权限
- <uses-permission android:name="android.permission.SEND_SMS"/>
如果在注册广播接收器时指定了权限参数(使用registerReceiver(BroadcastReceiver,IntentFilter,String,Handler)或清单文件中的
在清单文件中声明:
- <receiver android:name=".MyBroadcastReceiver"
- android:permission="android.permission.SEND_SMS">
- <intent-filter>
- <action android:name="com.test"/>
- </intent-filter>
- </receiver>
在注册的时候声明:
- IntentFilter filter = new IntentFilter("com.test);
- registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null );
要给它发消息,那广播发送的app就必须得申请获得相应的权限才行:
- <uses-permission android:name="android.permission.SEND_SMS"/>
动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器;
静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行;
当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态;
同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的;
当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的;
本文转载自微信公众号「Android开发编程」
责任编辑:姜华 来源: Android开发编程 Android广播机制应用程序(责任编辑:知识)
兴达国际(01899.HK)发布公告:预期2020年纯利同比减少50%
华润医药(03320.HK):东阿阿胶年度实现净利4328.93万元 基本每股收益0.07元
四川合江县2016年财政现代农业生产发展资金项目约完成总工程量的80%
成都市市级非税收入全部纳入四川省非税收入收缴系统进行征收管理