Android学习笔记(广播机制)
1.Android的广播机制介绍
收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同。接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理。好比我们收听交通电台的广播,电台中告诉我们现在在交通状况如何,但它并不关心我们接收到广播时做如何做出处理,这不是广播应该关心的问题,OK,到这里我们从生活中的一些小例子浅浅的理解了一下广播,那么Android 中的广播是如何操作的呢?
在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。
一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等
2.BroadcaseReceiver的作用
1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
2.同一app内部的不同组件之间的消息通信(单个进程);
3.同一app具有多个进程的不同组件之间的消息通信;
4.不同app之间的组件之间消息通信;
5.Android系统在特定情况下与App之间的消息通信。
3.BroadcaseRecevier的实现方法
1.创建一个类,继承BroadcastRecevier,并重写onRecevier()方法,onRecevier方法为接收到监听事件的回调方法
package com.example.broadcasereceiverdemo; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; public class TestReceiver extends BroadcastReceiver{ public TestReceiver(){
System.out.println("TestReceiver create");
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("onReceive///");
} }
2.注册广播
注册广播有两种方法
1.在AndroidManifrst.xml文件中注册
说明:创建一个receiver标签,intentfilter,设置接听的事件类型,Android:name:类名,Intent-filter:用来过滤发送的广播事件,只有符合里面的action的事件,才会被接收处理
例如:监听电池状态,就需要使用这样的方法进行注册

2.在程序代码中进行注册
注册方法比较灵活,当想使用的时候进行注册,不使用的时候进行关闭方法
1.registerReceiver(receiver,filter);注册, reciver对象,过滤的事件
2.unregisterReceiver(receiver);取消注册, reciver对象
如果一个BroadcaseReceiver用于更新UI,那么通常会使用这样的方法,在启动的时候进行注册,在不可见的时候进行取消注册
// TODO Auto-generated method stub
//1.创建一个广播接收器对象
TestBroadcastRecevier test = new TestBroadcastRecevier();
//2.创建一个Intent-filter
IntentFilter filter = new IntentFilter();
//3.为Intent-Filter添加Action
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
//4.注册广播接收器
MainActivity.this.registerReceiver(test, filter);
4. Android内置的BroadcaseAction

5.练习例子
1.在Activity中发出广播
1.定义一个类,继承BroadcastRecevier,重新onRecevier方法
package com.example.broadcastrecevierdemo; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; public class TestBroadcastRecevier extends BroadcastReceiver { public TestBroadcastRecevier(){
System.out.println("TestBroadcastRecevier 对象创建");
}
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
System.out.println("onReceiver");
} }
2.注册广播
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注册广播监听器 -->
<receiver android:name=".TestBroadcastRecevier">
<intent-filter>
<action android:name="android.inent.action.EDIT"/>
</intent-filter>
</receiver>
</application>
3.发送广播事件
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBtn = (Button) findViewById(R.id.sendBtn);
sendBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction(Intent.ACTION_EDIT);
MainActivity.this.sendBroadcast(intent);
}
});
}
点击按钮,程序运行结果

声明周期说明:从上面的Demo中可以看出,点击一次调用一次构造方法,然后调用onReceive方法,可知道当处理完成之后,广播接收器对象就会失效,下次再次调用,重新创建对象
2.接收系统广播
1.定义一个类,继承BroadcastRecevier,重新onRecevier方法,并实现短信内容的接收
public class TestBroadcastRecevier extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("xx");
//接收参数
Bundle bundle = intent.getExtras();
Object[] obj = (Object[]) bundle.get("pdus");
SmsMessage[] message = new SmsMessage[obj.length];
System.out.println(message.length);
for(int i=0 ; i<obj.length ; i++){
message[i] = SmsMessage.createFromPdu((byte[])obj[i]);
System.out.println(message[i].getDisplayMessageBody());
Toast.makeText(context, message[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show();
}
}
}
2.绑定广播接收类的监听代码
/**
* 绑定广播事件处理
* @author Administrator
*
*/
class MyRegistClick implements OnClickListener{ @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//1.创建一个广播接收器对象
test = new TestBroadcastRecevier();
//2.创建一个Intent-filter
IntentFilter filter = new IntentFilter();
//3.为Intent-Filter添加Action
filter.addAction(SMS_ACTION);
//4.注册广播接收器
MainActivity.this.registerReceiver(test, filter);
Toast.makeText(MainActivity.this, "绑定成功", Toast.LENGTH_SHORT).show();
} }
解除绑定的点击事件监听代码
/**
* 解除广播
* @author Administrator
*
*/
class MyUnRegistClick implements OnClickListener{ @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MainActivity.this.unregisterReceiver(test);
Toast.makeText(MainActivity.this, "解除绑定成功", Toast.LENGTH_SHORT).show();
} }
3.增加接收短信权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreciverdemo"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
4.使用Emalator Controller实现Eclipse发送短信到模拟器

Android学习笔记(广播机制)的更多相关文章
- Android学习笔记--广播(Broadcast)
1.Android广播分类 android的广播类型分为两类:标准广播和有序广播. 标准广播:异步广播,广播发出后,所有注册了的广播接收器都会同时接收到该广播.打个比方:做地铁过程中的语音播报,当列车 ...
- 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
- 【转】Pro Android学习笔记(十二):了解Intent(下)
解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...
- 【转】Pro Android学习笔记(十):了解Intent(上)
目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...
- 【转】Pro Android学习笔记(七):了解Content Provider(下上)
我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...
随机推荐
- ? super T ? extends T
? super T ?保存的是 T类型或者T类型的父类 ? extends T ?保存的是 T类型或者T类型的子类
- LeetCode解题报告:Insertion Sort List
Insertion Sort List Sort a linked list using insertion sort. leetcode subject思路:标准的插入排序.考察一下链表的操作. 对 ...
- 实例模拟struts核心流程
Struts,经典框架之一,每个java web 开发人员都应该晓得它的大名.这里,我就用一个简单实例来模拟一下struts的核心流程.具体实例如下: 主界面: 点击提交后,程序根据具体的actio ...
- Condition-线程通信更高效的方式
接近一周没更新<Java线程>专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且Rea ...
- 【游戏框架】Phaser
PhaserDesktop and Mobile HTML5 game framework Phaser Examples
- A configuration error occurred during startup. Please verify the preference field with the prompt: Cannot connect to vm
1.报错图 解决方法: Window->Preferences->MyEclipse Enterprice Workbench->Servers->Tomcat->选择你 ...
- 高效的TCP消息发送组件
目前的.net 架构下缺乏高效的TCP消息发送组件,而这种组件是构建高性能分布式应用所必需的.为此我结合多年的底层开发经验开发了一个.net 下的高效TCP消息发送组件.这个组件在异步发送时可以达到每 ...
- 新型Web劫持技术
该类新型Web劫持是利用script脚本实现的.在已知的案例中,黑客入侵了某地方门户网站,篡改了该网站的新闻页面,并向这些页面植入自己的广告.新闻及恶意代码.一旦用户从搜索结果页面点击进入被篡改过的新 ...
- mysql数据库还原出错ERROR:Unknown command ‘\\’解决手记
使用mysql命令行客户端,使用source导入备份文件,但导入中出错, ERROR: Unknown command ‘\\’. ERROR: Unknown command ‘\”. ERROR: ...
- hdu 4762 Cut the Cake概率公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题目大意:一个圆形蛋糕,现在要分成M个相同的扇形,有n个草莓,求n个草莓都在同一个扇形上的概率. ...