Android开发之BroadcastReceiver
BroadcastReceiver:广播接收者。用来接收系统或应用中的广播。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。
静态注册:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
广播接收者:
package com.example.hxdn.broadcastreceivertest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by hxdn on 2015/9/17.
*/
public class MyReceiver extends BroadcastReceiver {
private static final String TAG="MyReceiver";
@Override
public void onReceive(Context context,Intent intent)
{
String msg=intent.getStringExtra("msg");
Log.i(TAG,msg);
}
}
Activity:
package com.example.hxdn.broadcastreceivertest; import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { MyReceiver myReceiver=null;
IntentFilter intentFilter=null;
private Button btn1=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//动态注册时加入
btn1=(Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
send();
}
}); }
public void init()
{ myReceiver=new MyReceiver();
intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(myReceiver,intentFilter);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
public void send()
{
Intent intent=new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg","Hello Receiver");
sendBroadcast(intent);
}
@Override
public void onDestroy()
{
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
动态注册:
public void init()
33 {
34
35 myReceiver=new MyReceiver();
36 intentFilter=new IntentFilter();
37 intentFilter.addAction("android.intent.action.MY_BROADCAST");
38 registerReceiver(myReceiver,intentFilter);
39 }
需要解绑:
public void onDestroy()
70 {
71 super.onDestroy();
72 unregisterReceiver(myReceiver);
73 }
否则会抛出异常。 广播主要分为三种:
普通广播(Normal Broadcasts):
1、所有广播接收者都可以接收到的广播,同级别的接收者接收顺序随机不确定。
2、不能拦截广播的继续传播也不能处理处理广播
3、同级别动态注册高于静态注册
有序广播(Ordered Broadcasts):
1、按照接收者的优先级接收,优先级可以在intnt-filter里的priority里设置,值越大,优先级越高。
2、可以拦截广播的继续传播,高级别的广播接收器可以决定低级别的广播接收器是否能接收到广播。可以处理广播。
3、同级别动态注册高于静态注册
黏性广播(Sticky Broadcasts):
1、不能处理广播传递给下一个接收者,而且广播一直存在,不销毁。(不常用)
在AndroidManifest.xml的广播注册时加上<intent-filter android:priority="1000">
- <receiver android:name=".FirstReceiver">
- <intent-filter android:priority="1000">
- <action android:name="android.intent.action.MY_BROADCAST"/>
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </receiver>
android:priority的值从-1000到1000值越大权限越大。
- public void send(View view) {
- Intent intent = new Intent("android.intent.action.MY_BROADCAST");
- intent.putExtra("msg", "hello receiver.");
- sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION"); //第二参数不为null则需要权限
- }
使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。 设置权限则发出的广播只有当你有权限时才能收到。 android:priority值越大则代表这个接受者优先级越高。优先级越高可先处理广播。 优先级高的广播可用abortBroadcast();终止这个广播。
Android开发之BroadcastReceiver的更多相关文章
- Android开发之BroadcastReceiver的使用
1.静态注册. 在manifest中注册. <receiver android:name="com.exce.learnbroadcastreceiver.MyReceiver&quo ...
- Android开发之旅5:应用程序基础及组件
引言 上篇Android开发之旅:应用程序基础及组件介绍了应用程序的基础知识及Android的四个组件,本篇将介绍如何激活组关闭组件等.本文的主题如下: 1.激活组件:意图(Intents) 1.1. ...
- Android开发之旅4:应用程序基础及组件
引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android开发之Git配置
Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
- Android开发之旅: Intents和Intent Filters(理论部分)
引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
随机推荐
- ubuntu完全卸载一个软件
今天卸载一个软件,老是有配置残留,网上找到了解决方案: 查看已安装的软件: dpkg -l |grep 软件名 找到一大堆相关的包,然后卸载核心的包: sudo apt-get remove --pu ...
- 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]
软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] 说明结对编程的优点和缺点. 结对编程的优点如下: 在独立设计.实现代码的过程中不 ...
- [Objective-c 基础 - 2.2] OC弱语法、类方法
A.OC弱语法 1.在运行的时候才会检查方法的声明和实现 2.没有声明只有实现的方法也能正常运行,只要在调用之前定义即可 3.类的声明必须存在,否则会出现运行时错误 B.类方法 1.是类名调用的方 ...
- android模拟器访问localhost或127.0.0.1报错
在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正 ...
- home_work--用户登陆
前提: 根据文本中的已有用户和密码,实现登陆的交互:在用户输入用户名后,会有一个检测用户是否被锁定的环节:如果用户三次密码输入错误,则该用户则会被添加到锁定文件中,无法登陆. 涉及到的知识点: 1.p ...
- Web- 一些标签样式
网上找来的.有点用 1.只有下划线的文本框:<input style="border:0;border-bottom:1 solid black;background:;"& ...
- Windows下如何检测用户修改了系统时间并且把系统时间改回来
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Windows下如何检测用户修改了系统时间并且把系统时间改回来.
- mongoDB 3.0.3 以上GUI 连接认证问题
因为项目要用到mongoDB,今天尝试搭建了一下. 首先mongo还是很好装的,yum 或者手动下载都可以,我是yum安装的最新版本的3.0.4. 主要是安装完成之后,需要安装一个GUI管理工具,我尝 ...
- Linux时间同步方式记录
Linux时间同步 部署Hadoop集群,遇到各个linux服务器的时间不同步的问题,于是研究了一下linux的时间同步方式,特将同步方式,总结如下: A. 前提条件 a) 网络是连通 ...
- 理解 auto_ptr<T>
1.auto_ptr<T>解决什么问题? 在堆上获取的资源,客户可能会忘记delete,或者由于异常没有执行到delete,导致资源泄漏.在栈上分配的对象,有个特点,不论出现什么情况,超出 ...