Android基础总结(4)——广播接收器
在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的。Android提供了一整套完整的API,允许应用程序自由地发送和接收广播。发送广播就是借助之前了解过的Intent,接收广播则需要用到广播接收器(Broadcast Receiver)。.
1、广播的类型
- 标准广播:Normal broadcast,是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此他们之间没有任何先后顺序可言。这种广播效率比较高,同时也意味着无法被截断。
- 有序广播:Ordered broadcast,是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有顺序的,优先级高的广播接收器可以先接受到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
2、广播接收器的使用方法
Android系统内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。例如,手机开机完成后会发出一条广播消息,电池的电量发生变化时会发出一条广播,时间或时区发生改变时也会发出一条广播等等;我们如果想要接收到这些广播,则需要用到广播接收器。
创建广播接收器的方法很简单,我们只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑可以在这个方法中进行处理。
3、广播接收器的注册
广播接收器可以自由地对自己感兴趣的广播进行注册,这样才能在有相应的广播发出时,广播接收器就能够收到该广播,并在内部进行相应的逻辑处理。注册广播的方式有两种:
- 在代码内注册:也称动态注册。这种注册方法一般过程是
- 在Activity中创建一个IntentFilter的对象,然后用IntentFilter对象的addAction()方法添加相应的广播类型
- 我们还需要有一个我们自定义的广播接收器的对象,
- 然后通过Activity的registerReceiver(BroadcastReceiver , IntentFilter)将过滤器和广播接收器连接在一起,这样就完成了注册
- 最后要记得,动态注册的广播接收器一定要记得取消注册才行,取消时是通过unregisterReceiver(networkChangeReceiver);方法就可以取消注册
public class ThirdActivity extends Activity { private IntentFilter intentFilter ;
private NetworkChangeReceiver networkChangeReceiver ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
10
11 intentFilter = new IntentFilter() ;
12 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
13 networkChangeReceiver = new NetworkChangeReceiver() ;
14 registerReceiver(networkChangeReceiver, intentFilter) ;
unregisterReceiver(networkChangeReceiver);
} class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changed", Toast.LENGTH_SHORT).show();
}
}
}优缺点:动态注册的广播接收器可以自由地控制注册和注销,非常灵活,但是也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在Activity的onCreate()方法中的。
- 在AndroidManifest.xml中注册:也称静态注册。这种情况下,我们一般不用内部类的方法来定义广播接收器,因为需要在AndroidManifest.xml中进行注册时需要用到我们自定义的广播接收器的类名。其具体的注册方法同Activity的注册方法类似。在intent-filter中加入我们想要接收的广播就行了。
<receiver android:name=".BootCompleteReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED />
</intent-filter>
</receiver>静态注册的优点在于可以一开机就可以开始接收相应的广播,不会像动态注册那样必须要等到启动程序后才可以。
- 此外,还有一点非常重要的是,android系统为了保证应用程序的安全性做了规定,如果程序中需要访问系统的关键性信息,必须在配置文件中声明权限才行,否则程序将会直接崩溃,比如像上面的查询网络状态就需要声明权限。
- 不要在广播接收器的onReceive()方法中添加过多的逻辑或者进行任何耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行太长时间而没有结束时,系统会报错。
4、发送自定义广播
广播是一种可以跨进程的通信方式,我们可以在我们的应用程序中发送广播,其他应用进程也可以收到我们的广播信息。发送广播是通过Intent来实现的。
- 发送标准广播:通过创建一个Intent对象,然后通过Activity的sendBroadcast(Intent intent)方法来进行发送。广播的类型可以在我们创建Intent对象的时候通过构造方法Intent(String action)来自定义,eg:
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.keli.MY_BROADCAST") ;
sendBroadcast(intent);
}
});当然,我们也可以在发送广播的Intent中携带一些数据。然后在广播接收器的onReceive()方法中通过getIntent()方法来获取Intent,并取出相应的数据。
- 发送有序广播:发送有序广播的方法和发送标准广播的方法基本相同,只是需要将最后的sendBroadcast(intent)发送方法换成sendOrderedBroadcast(intent,null)即可。这里的第二个参数是一个与权限相关的字符串。那么设定广播的先后顺序是根据广播的优先级来判断的,我们可以在AndroidManifest.xml中注册广播接收器时通过android:priority属性来设置优先级。
<receiver android:name=".MyBroascastReceiver">
<intent-filter android:priority="100">
<action android:name="com.keli.MY_BROADCAST"/>
</intent-filter>
</receiver>此外,对于有序广播,我们可以在我们的广播接收器中的onReceive()方法的逻辑中对该广播进行截断,截断广播的方法也很简单,直接调用abortBroadcast();方法就可以了。
- 使用本地广播:Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。主要是使用了一个LocalBroadcastManager对象来对广播进行管理,并提供了发送和注册广播接收器的方法。本地广播是无法通过静态注册的方法进行注册的。
5、在广播接收器中启动活动
在广播接收器中也可以启动一个活动,但是我们启动活动之前必须给intent加入FLAG_ACTIVITY_NEW_TASK标志,否则将无法启动。下面的代码是创建一个广播接收器,在接收到广播后弹出一个警告对话框,并且设置该对话框不可取消,只能通过点击确定按钮来启动另一个活动页面。
public class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
//构建对话框,并设置对话框的标题、内容
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context) ;
dialogBuilder.setTitle("Warning") ;
dialogBuilder.setMessage("You are forced to ofline. Please try to login again") ;
//设置对话框不可取消
dialogBuilder.setCancelable(false) ;
//设置对话框的确定按钮,第一个参数是按钮上显示的text,
11 //第二个参数是添加点击确定按钮的响应事件,这里我们设定为启动一个登陆界面
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(context, LoginActivity.class) ;
//必须添加FLAG_ACTIVITY_NEW_TASK标志
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create() ;
//设置AlertDialog的类型,保证在广播接收器中可以正常弹出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
}
Android基础总结(4)——广播接收器的更多相关文章
- Android组件系列----BroadcastReceiver广播接收器
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android应用程序注册广播接收器(registerReceiver)的过程分析
前 面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对 Android应用程序来说,订阅消息其实就是注册广播接收器, ...
- android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题
最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新, ...
- android基础(二)Broadcast Receiver知识
1.广播的注册 (1)动态广播注册: 优点:可以灵活控制广播的注册与撤销 缺点:必须在程序启动时才能接收广播 IntentFilter :当Intent在组建之间传递时,组件想告诉android系统自 ...
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...
- Android应用程序发送广播(sendBroadcast)的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程 ...
- android#boardcast#发送自定义广播
广播主要分为两种类型,标准广播和有序广播,通过实践的方式来看下这两种广播具体的区别. 一.发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发.因此新 ...
- Xamarin.Android广播接收器与绑定服务
一.前言 学习了前面的活动与服务后,你会发现服务对于活动而言似乎就是透明的,相反活动对于服务也是透明的,所以我们还需要一中机制能够将服务和活动之间架起一座桥梁,通过本节的学习,你将会学到广播与绑定服务 ...
- Android -- 简单广播接收与发送(2)--动态注册广播接收器
1. 效果图
随机推荐
- Highcharts 功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库
http://www.hcharts.cn/index.php 暂无介绍,等待后续补充
- ARM地址映射
转自:http://blog.csdn.net/a3163504123/article/details/10958229 重映射之后,一般原来的地址依然有效.也就是说,可能两个地址,对应一个存储单元. ...
- SVN Server配置详解 及备份
SVN简介和工作原理 subversion(简称svn)是近几年崛起的版本管理软件,是cvs的接班人,目前绝大多数开源软件都使用svn作为代码版本管理软件.Subversion支持linux和wind ...
- TFS Build Error: CSC : fatal error CS0042: Unexpected error creating debug information file 'xxxx.PDB'
CSC : fatal error CS0042: Unexpected error creating debug information file 'xxxx.PDB' -- 'c:\Builds\ ...
- 数据库随机取n条记录
SQL Server SELECT TOP N * FROM 表名 ORDER BY NEWID() My SQL SELECT * FROM 表名 ORDER BY RAND() ...
- @RequesParam注解源码解析
- 如何获取客户端IP、操作系统、浏览器
request.getRemoteAddr();//获取IP request.getHeader("User-Agent");//获取操作系统信息.浏览器信息. protected ...
- AP_AP系列 - 发票管理分析(案例)
2014-07-07 Created By BaoXinjian
- Report_客制化Excel报表中的XLS标记(案例)
2014-06-06 Created By BaoXinjian
- 斑马打印机网卡ZebraNet配置(有线)
实图: 抽象图: 说明: 1.并口,用于连接斑马打印机一端 2.网络连接状态指示灯 3.打印状态指示灯 4.测试按钮,在连接打印机的情况下,按下此键,会打印出网卡信息. 5.网线接口 按下测试按钮之后 ...