25、BroadCastRecevier
BroadCastRecevier 有两种注册方式
1. 清单文件里注册: 一旦应用程序被部署到手机, 广播接受者就会生效
2. 代码里面注册: 一旦代码所在的进程被杀死了, 广播接受者就失效了.
广播接受者分为两种类型:
1. 有序的广播. 短信到来的广播 电话拨打的广播
-1000~1000 设置广播的优先级
android:priority="1000"
从高优先级->低优先级 依次传递
abortbroadcast() 方法 可以终止广播事件。
2. 无序广播.
没有优先级 任何人 注册广播接受者的人,都可以接收到广播.
没有abortboradcast()方法。
sendBroadcast(intent); // 发送一条广播
sendOrderedBroadcast(intent, receiverPermission); // 发送一条有序广播
sendOrderedBroadcast(intent, receiverPermission, resultReceiver,
scheduler, initialCode, initialData, initialExtras)
如果发送广播的时候 使用的 上面的api发送出去的广播 第三个参数 resultReceiver 指定了广播的接受者。
即便是中间我把广播给终止 abortbroadcast()resultReceiver 还是会接受到广播时间。
setResultData(null); 设置广播中的数据为空。
案例:通过广播接受者监听用户的短信
import java.net.HttpURLConnection;
import java.net.URL; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage; /**
* 通过广播接受者监听用户的短信
* @author dr
*/
public class SmsReceiver extends BroadcastReceiver { // 当接受到短信的时候
// android.provider.Telephony.SMS_RECEIVED
@Override
public void onReceive(Context context, Intent intent) { // 阻塞时间超过10秒 很容易anr 异常
System.out.println("thread name =" + Thread.currentThread().getName()); // intent 存放的有接收到的短信的内容
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) { SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
// 获取短信的正文内容
final String content = message.getMessageBody();
// 获取短信的发送者
final String address = message.getOriginatingAddress();
System.out.println(content);
System.out.println(address); // 把收到短信的系统的广播事件给结束
if ("15555215556".equals(address)) {
abortBroadcast(); // 把收到短信的系统的广播事件给结束 SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(address, null,
"ni qu siba ,wo yijing xihuan le xxx", null, null);
} // 因为广播接受者的生命周期非常的端 ,广播接受者所在的进程很有可能会别系统回收
// 子线程也会被销毁.
// service
new Thread() { @Override
public void run() {
String path = "http://192.168.1.247:8080/web/SmsServlet?address="
+ address + "&content=" + content;
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
System.out.println(conn.getResponseCode());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.run();
}
}.start(); }
} }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itcast.smslistener"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SEND_SMS" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".SmsReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application> </manifest>
案例:修改号码为ip拨号
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_ipnumber"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="设置ip号码" />
</LinearLayout>
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; /**
* 实现自动ip拨号。比如:添加一个17951后。
* 然后你在拨打电话的时候,默认在你拨打的电话前面加上17951。
*
* @author dr
*/
public class IpcallActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
} public void click(View view) {
EditText et = (EditText) this.findViewById(R.id.et_ipnumber);
String ipnumber = et.getText().toString().trim();
SharedPreferences sp = getSharedPreferences("config",
Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("ipnumber", ipnumber);
editor.commit();
}
}
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; public class OutGoingCallReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
// getResultData():得到当前拨打的电话号码。
System.out.println(getResultData());
// abortBroadcast();
SharedPreferences sp = context.getSharedPreferences("config",
Context.MODE_PRIVATE);
String ipnumber = sp.getString("ipnumber", ""); // 修改广播中的数据(修改电话号码)。
setResultData(ipnumber + getResultData());
} }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itcast.ipcall"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".IpcallActivity"
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=".OutGoingCallReceiver" >
<intent-filter android:priority="1000" >
<!-- 广播事件:拦截外拨电话 -->
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
</application> </manifest>
范例:广播接收者的类型
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View; /**
* 广播接收者的类型
* @author dr
*/
public class SmslistenercodeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
} public void register(View view) {
IntentFilter filter = new IntentFilter(
"android.provider.Telephony.SMS_RECEIVED");
SmsReceiver receiver = new SmsReceiver();
registerReceiver(receiver, filter);
} class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("接收到了广播");
}
} }
<uses-permission android:name="android.permission.RECEIVE_SMS" />
25、BroadCastRecevier的更多相关文章
- 邮件服务端口 port 25、109、110、143、465、995、993
邮件服务端口 port 25.109.110.143.465.995.993 25端口(SMTP):25端口为SMTP(Simple Mail TransferProtocol,简单邮件传输协议) ...
- ZT ---- 给孩子的信(孩子写给爸爸妈妈的信在24、25、26楼)
胡同口 > 情感 > 婚后空间 > 给孩子的信(孩子写给爸爸妈妈的信在24.25.26楼) 给孩子的信(孩子写给爸爸妈妈的信在24.25.26楼)分享: 腾讯微博 新浪微博 QQ空间 ...
- 25、自动装配-@Profile根据环境注册bean
25.自动装配-@Profile根据环境注册bean 指定组件在哪个环境的情况下才能被注册到容器中 加了环境标识的,只有这个环境被激活才能注册到组件中 默认是default环境 写在类上,整个配置类的 ...
- 25、继续echarts实现中国地图
1. 以上是实现的效果 下边是实现的代码,上一篇地图没有颜色,是因为没有引入zrender包,因为echarts画地图是基于zrender实现的 <!DOCTYPE html> <h ...
- 25、oracle(一)
1)了解oracle背景,概念和特点 2)掌握oracleSQL对单表各种查询操作 3)掌握oracleSQL中函数的使用 4)掌握数值型number,字符串型varchar2,日期型date,条件判 ...
- 25、手把手教你Extjs5(二十五)Extjs5常用组件--form的基本用法
Extjs Form是一个比较常用的控件,主要用来显示和编辑数据的,今天这篇文章将介绍Extjs Form控件的详细用法,包括创建Form.添加子项.加载和更新数据.验证等. Form和Form Ba ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- 25、mysqlreport(my.cnf)调优工具
25.1.mysqlreport介绍: mysqlreport以很友好的方式显示 MySQL状态变.事实上,它几乎报告了所有的状态.不像 SHOW STATUS 只是在显示 了100多个状态值,mys ...
- 『忘了再学』Shell基础 — 25、扩展正则表达式
目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...
随机推荐
- mybatis generator自动生成 实体类, sqlmap配置文件 详细介绍
我使用的是Eclipse Luna 装了自己常用的插件, generator也是其中一个推荐下载 MyBatis_Generator_1.3.1.zip离线安装包 <?xml version=& ...
- 获取网页上数据(图片、文字、视频)-b
Demo地址:http://download.csdn.net/detail/u012881779/8831835 获取网页上所有图片.获取所有html.获取网页title.获取网页内容文字... . ...
- UILabel设置行间距和字间距并计算高度-b
#define UILABEL_LINE_SPACE 6 #define HEIGHT [ [ UIScreen mainScreen ] bounds ].size.height //给UILabe ...
- 2733: [HNOI2012]永无乡 - BZOJ
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 1003: [ZJOI2006]物流运输trans - BZOJ
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 深入js的面向对象学习篇(继承篇)——温故知新(三)
写这篇有关继承的文章时,突然想起,几天前的面试.因为习惯在学习知识的时候加上自己的理解,很喜欢用自己话来解释,于是乎当面试被问起继承原理时,噼里啪啦一大堆都是自己组织的话,(也可能是因为个人紧张.外加 ...
- PHP htmlspecialchars() 函数
定义和用法 htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体. 预定义的字符是: & (和号) 成为 & " (双引号) 成为 " ...
- android dialog点击其他区域消失
只需调用dialog对象的setCanceledOnTouchOutside方法,传入参数为true即可. 如下代码实现: //点击其他区域dialog消失 menuDialog.setCancele ...
- P127、面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵:1 2 3 4 5 6 7 89 10 11 1213 14 15 16则依次打印出 ...
- j2se jndi
http://blog.csdn.net/lldwolf/article/details/2299622 正如你可以看到,从JNDI中检索对象是相当方便,简单.通过使用JNDI来存储配置信息,无状态对 ...