Android_BroadcastReceiver广播接收者详解及应用

1.概述

广播接收者(BroadcastReceiver)用于接收广播,在Android系统中,广播应用非常常见。例如当开机完成后系统会产生一条action为android.intent.action.BOOT_COMPLETED的广播,可达到开机启动的目的;当手机接收到一条短信,系统会产生一条action为android.provider.Telephony.SMS_RECEIVED的广播,接收到这条广播就对短信进行处理 等等。

动态广播接收器比静态广播接收器要接受的早,可以尝试在AndroidManifest.xml静态和java代码动态注册广播接收者~~降低被杀死的概率

2.简单实现广播接收者

//1.继承BroadcastReceiver,覆写onReceive方法,intent包含广播对象信息
public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		/*
		 *  简要动作,一般不超过10秒
		 *  ...To Do..
		 */
	}
}
<!-- 2.在项目清单文件完接收者成配置 -->
<!-- 系统发送一个广播,action为下面指定内容后,匹配该receiver -->
<receiver android:name=".SmsReceiver" >
	<intent-filter>
	    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
	</intent-filter>
</receiver>

3.广播类型

(1).普通广播

//发送一个广播,所以监听该广播的广播接收者都可以监听到改广播
public void click(View view){
	Intent intent = new Intent(this, SmsReceiver.class);
	sendBroadcast(intent);
}

(2).异步广播

/*
 * 在onCreate()使用registerReceiver(BroadcastReceiver, IntentFilter)注册,但要注意在onDestroy()要解除注册
 */

//	1.在onCreate注册receiver
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	IntentFilter filter = new IntentFilter();
	filter.addAction("baidu.myreceiver");
	registerReceiver(receiver, filter);
	
}
//	2.在onDestroy要解除注册receiver
@Override
protected void onDestroy() {
	unregisterReceiver(receiver);
	super.onDestroy();
}

(3).有序广播

/*
 * 按照接收者的优先级顺序接收广播,取值范围为1000到-1000,值越大,优先级越高,安卓系统关键接收者默认为0,
 * 优先级可以在xml文件的intent-filter标签中的 priority 中声明。
 */
public class MainActivity extends Activity {
	public void click(View view){
		Intent intent = new Intent();
		intent.setAction("com.baidu.smsreceiver");
		//1.1.发送一个有序广播
		sendOrderedBroadcast(intent, receiverPermission);
		//1.2.发送一条有序广播,为该广播添加一些属性,resultReceiver为最终执行的接收者,即使abortBroadcast();也要执行
		sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)
	}
}
public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Object[] objs = (Object[]) intent.getExtras().get("pdus");
		for(Object obj: objs){
			SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])obj);
			String content = smsMessage.getMessageBody();
			String number = smsMessage.getOriginatingAddress();
		}
		abortBroadcast();//终止向下一个接收者传递
	}
}
有序广播可以终止,无序的广播不可以终止!

4.注册广播

(1).静态注册

<!-- 在项目清单文件中注册 -->
<receiver android:name=".SmsReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

(2).动态注册

查看上面的一步广播,注意:注册之后,在当前activity销毁时在onDestroy()中解除注册

使用动态注册的生命周期与应用相关,而静态注册则周期更长,即使应用没有被启动,在监听到需要接收的广播时,也可以接收!

5.自定义permission

//	1.sendBroadcast一个广播并接收一个使用权限
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
	}
	public void click(View view){
		Toast.makeText(this, "Ok~!!~", 1).show();
		Intent intent = new Intent();
		intent.setAction("com.baidu.smsreceiver");
		sendBroadcast(intent, "baidu.permission");	//为该广播添加一个权限,但需要在该项目的项目清单文件中定义及添加权限
	}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.baidu.smstest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
<!-- 2.在本应用中定义一个permission -->
    <!-- 出示该permission -->
    <permission android:name="baidu.permission" android:protectionLevel="dangerous"/>
    <!-- 使用该permission -->
    <uses-permission android:name="baidu.permission"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    </application>

</manifest>
//	3.接收者继承BroadcastReceiver,覆写onReceive方法
public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// ...
	}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testreceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
<!-- 4.接收者项目清单文件定义以出示该权限 -->
    <permission android:name="baidu.permission" android:protectionLevel="dangerous"/>
    <uses-permission android:name="baidu.permission"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- permission属性和指定级别 -->
        <receiver android:name=".TextReceiver" android:permission="baidu.permission">
            <intent-filter android:priority="800">
                <action android:name="com.baidu.smsreceiver"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

6.应用

(1).短信窃听器

/*
* 1.继承BroadcastReceiver,覆写onReceive方法
*/
public class SmsReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		//	1.1接收到短信信息,get("pdus"),可能包含多条短信信息,故用数组表示
		Object[] objs = (Object[]) intent.getExtras().get("pdus");
		for(Object obj: objs){
		//	1.2转换为每条短信的byte[] 得到smsMessage对象
			SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])obj);
		//	1.3对短信操作,获得关键数据
			String content = smsMessage.getMessageBody();		//短信内容
			String number = smsMessage.getOriginatingAddress();	//短信号码
			if("110".equals(number)){
				abortBroadcast();								//终止广播向下传递
				SmsManager manager = SmsManager.getDefault();	//得到Sms短信管理器
				//转发一条短信,需要声明权限
				manager.sendTextMessage("5556", null, "Kill", null, null);
			}
			System.out.println("content="+content);
			System.out.println("number="+number);
		}
		Toast.makeText(context, "OK!", Toast.LENGTH_SHORT).show();
	}
}
<!-- 2.在项目清单文件中配置接收者, 及出示可能需要的权限 -->
<!-- 接收短信权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 发送短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    
    <!-- 广播接收者声明 -->
    <receiver android:name=".SmsReceiver" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>
</application>

(2).电话拨打器

public class TextReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		//得到拨打电话号码
		String number = getResultData();
		//处理拨打的电话号码
		setResultData("010"+number);
		System.out.println(number);
	}

}
<!-- 出示处理外来电话的权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <receiver android:name=".TextReceiver">
        <intent-filter android:priority="800">
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>
</application>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《OPhone应用开发权威指南》2010 黄晓庆 博文视点 broadview 第1章 OPhone平台概述 1 1.1 OPhone的架构 1 1.1.1 Linux内核 2 1.1.2 本地库 2 1.1.3 OPhone运行环境 3 1.1.4 Widget运行环境 3 1.1.5 应用程序框架 4 1.1.6 应用程序 5 1.2 开发OPhone应用程序 5 1.2.1 开发语言 5 1.2.2 OPhone SDK 5 1.2.3 OPhone开发者社区 6 1.3 将OPhone应用上传到Mobile Market 7 1.3.1 Mobile Market的商业模式 7 1.3.2 Mobile Market发布流程 8 1.4 小结 11 第2章 OPhone开发环境和流程 12 2.1 安装Eclipse和ODT 12 2.1.1 安装Java SDK 12 2.1.2 安装Eclipse 13 2.1.3 安装OPhone SDK 13 2.1.4 安装和配置ODT插件 14 2.2 第一个OPhone应用程序 16 2.2.1 新建OPhone项目 16 2.2.2 运行OPhone项目 18 2.2.3 更新资源文件 21 2.3 调试OPhone应用程序 24 2.3.1 设置断点 25 2.3.2 启动调试 25 2.3.3 单步跟踪 26 2.4 在命令行下开发OPhone程序 27 2.4.1 创建项目 27 2.4.2 用Ant编译项目 28 2.4.3 运行应用程序 28 2.5 OPhone SDK介绍 30 2.5.1 OPhone模拟器 30 2.5.2 模拟SD卡 32 2.5.3 ADB 32 2.5.4 DDMS 33 2.6 小结 34 第3章 OPhone应用程序模型 35 3.1 OPhone应用程序基础 35 3.1.1 OPhone应用程序运行环境 35 3.1.2 OPhone应用程序的组成 36 3.2 Activity 43 3.2.1 Activity创建与声明 44 3.2.2 Activity的生命周期 48 3.2.3 启动Activity 55 3.2.4 Activity和Task 58 3.3 Content Provider 61 3.4 BroadcastReceiver 64 3.5 Service 66 3.6 安全与许可 66 3.6.1 安全架构 66 3.6.2 许可 67 3.7 数字签名 70 3.7.1 签名策略 70 3.7.2 签名步骤 71 3.8 小结 72 第4章 图形用户界面 73 4.1 用户界面概述 73 4.1.1 手机软硬件特性的发展 73 4.1.2 如何影响应用程序开发 74 4.1.3 OPhone图形引擎 74 4.2 用户界面设计 75 4.2.1 声明布局文件 75 4.2.2 编写XML文件 75 4.2.3 加载XML文件 76 4.2.4 将数据绑定到AdapterView 77 4.2.5 创建菜单 79 4.2.6 创建Dialog 81 4.2.7 通知用户 83 4.2.8 处理用户输入 84 4.2.9 样式与主题 84 4.3 常用Widget 86 4.3.1 TextView 86 4.3.2 Button 89 4.3.3 ImageView 90 4.3.4 ProgressBar 92 4.3.5 DatePicker/TimePicker 94 4.3.6 GridView 96 4.3.7 Spinner 98 4.3.8 Gallery 100 4.3.9 TabHost 101 4.4 高级图形用户界面技术 104 4.4.1 图形系统类结构 104 4.4.2 常用布局类 107 4.4.3 绘制图形 114 4.4.4 构建自己的组件 123 4.5 图形动画 130 4.5.1 Animation 131 4.5.2 Interpolator 136 4.5.3 AnimationSet 137 4.5.4 自定义动画 138 4.6 Resource介绍 143 4.6.1 资源类型 143 4.6.2 使用资源 144 4.6.3 资源适配 146 4.7 俄罗斯方块实例 147 4.7.1 方块的数据结构 147 4.7.2 方块渲染 150 4.7.3 游戏区域设计 152 4.7.4 碰撞检测 156 4.7.5 输入处理 158 4.7.6 积分排行榜 160 4.8 小结 161 第5章 OpenGL ES编程 162 5.1 OpenGL ES概述 162 5.1.1 OpenGL ES设计准则 162 5.1.2 OpenGL ES 与OpenGL的不同 163 5.1.3 一个简单的OpenGL ES程序 166 5.2 3D观察与变换 169 5.2.1 一个简单的例子:绘制立方体 169 5.2.2 理解变换 175 5.2.3 投影变换 177 5.2.4 视口变换 179 5.2.5 矩阵堆栈 180 5.3 绘制图元 180 5.3.1 图元种类 180 5.3.2 指定顶点数据 182 5.3.3 绘制图元 186 5.4 颜色和光照 186 5.4.1 设置颜色和材质 187 5.4.2 光照 188 5.5 光栅化和片元处理 193 5.5.1 背面剪裁 193 5.5.2 纹理映射 193 5.5.3 雾 205 5.5.4 反走样 207 5.5.5 像素测试 209 5.5.6 将片元合并到颜色缓存 212 5.6 帧缓存操作 216 5.6.1 清空缓存 216 5.6.2 读取颜色缓存 216 5.6.3 强制完成绘图指令 217 5.7 其他 217 5.7.1 行为控制函数 217 5.7.2 状态查询 218 5.8 EGL简介 218 5.9 小结 222 第6章 数据持久化存储 223 6.1 文件存储 223 6.1.1 存储至默认文件夹 224 6.1.2 存储至指定文件夹 226 6.1.3 存储至SD卡 227 6.1.4 读取资源文件 228 6.2 SharePreference 229 6.3 SQLite 233 6.3.1 创建数据库 234 6.3.2 SQLiteOpenHelper 236 6.3.3 创建触发器 240 6.3.4 创建索引 241 6.3.5 创建视图 241 6.3.6 操作数据 243 6.3.7 将Cursor绑定到AdapterView 250 6.4 Content Provider 254 6.4.1 概述 254 6.4.2 Content Provider加载机制 256 6.4.3 创建Content Provider 257 6.4.4 Content Provider更新的通知机制 267 6.4.5 DAO接口及实现 269 6.4.6 在新线程内处理数据 270 6.5 小结 273 第7章 移动多媒体编程 274 7.1 多媒体文件格式与编码 274 7.1.1 多媒体文件格式 274 7.1.2 编码 275 7.1.3 OPhone平台支持的媒体格式 276 7.1.4 选择合适的媒体文件 277 7.2 音频和视频播放 277 7.2.1 三种不同的数据源 278 7.2.2 MediaPlayer的状态 281 7.2.3 音乐播放器实例 284 7.2.4 播放视频 296 7.3 录制音频 299 7.3.1 MediaRecorder的状态图 299 7.3.2 录音器实例 301 7.4 MP3文件格式分析 306 7.4.1 MP3文件介绍 307 7.4.2 ID3V1标签 307 7.4.3 ID3V2标签 310 7.4.4 MP3帧结构 316 7.4.5 分割MP3文件 323 7.5 案例分析——铃声DIY 327 7.6 小结 329 第8章 让程序在后台运行 330 8.1 Service概述 330 8.2 Service编程实践 331 8.2.1 创建Service 331 8.2.2 启动和停止Service 333 8.2.3 通知用户 335 8.2.4 不阻塞用户操作 337 8.2.5 Service与Activity通信 343 8.3 后台播放音乐 345 8.3.1 跨进程调用 345 8.3.2 创建AIDL接口文件 346 8.3.3 实现AIDL接口 347 8.3.4 绑定Service 351 8.3.5 调用IPC方法 352 8.4 小结 353 第9章 访问网络数据和服务 354 9.1 HTTP协议简介 354 9.1.1 HTTP协议的主要特点 354 9.1.2 HTTP连接过程 355 9.1.3 HTTP消息格式 355 9.2 线程管理 358 9.2.1 匿名Thread 358 9.2.2 java.util.concurrent框架 359 9.2.3 AsyncTask 369 9.3 网络编程接口 373 9.3.1 HttpClient API介绍 373 9.3.2 GET方法的使用和限制 378 9.3.3 使用POST方法上传附件 382 9.3.4 从服务器端下载图片 390 9.4 设计C/S通信数据格式 392 9.4.1 对象序列化 396 9.4.2 使用XML传输对象 401 9.5 小结 409 第10章 高级通信技术 410 10.1 电话 410 10.1.1 电话呼叫 410 10.1.2 监听电话状态 412 10.1.3 查询电话属性 416 10.1.4 读取通话记录 416 10.2 短消息 420 10.2.1 发送短信 421 10.2.2 接收短消息 423 10.3 小结 426 第11章 访问硬件层 427 11.1 访问相机 427 11.1.1 创建Camera对象 427 11.1.2 设置Camera参数 428 11.1.3 预览 429 11.1.4 拍摄照片 429 11.2 访问位置服务 431 11.2.1 创建LocationManager 431 11.2.2 LocationProvider类 432 11.2.3 监听位置更新 433 11.2.4 接近警报 434 11.3 访问传感器 435 11.3.1 SensorManager类 435 11.3.2 监听传感器事件 436 11.3.3 方向传感器应用—指南针 437 11.3.4 模拟传感器 440 11.4 小结 443 附录A 如何导入源代码 444 附录B Resin安装与Servlet部署 446 参考文献 450

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值