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);   设置广播中的数据为空。

案例:通过广播接受者监听用户的短信

 1 import java.net.HttpURLConnection;
 2 import java.net.URL;
 3
 4 import android.content.BroadcastReceiver;
 5 import android.content.Context;
 6 import android.content.Intent;
 7 import android.telephony.SmsManager;
 8 import android.telephony.SmsMessage;
 9
10 /**
11  * 通过广播接受者监听用户的短信
12  * @author dr
13  */
14 public class SmsReceiver extends BroadcastReceiver {
15
16     // 当接受到短信的时候
17     // android.provider.Telephony.SMS_RECEIVED
18     @Override
19     public void onReceive(Context context, Intent intent) {
20
21         // 阻塞时间超过10秒 很容易anr 异常
22         System.out.println("thread name =" + Thread.currentThread().getName());
23
24         // intent 存放的有接收到的短信的内容
25         Object[] pdus = (Object[]) intent.getExtras().get("pdus");
26         for (Object pdu : pdus) {
27
28             SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
29             // 获取短信的正文内容
30             final String content = message.getMessageBody();
31             // 获取短信的发送者
32             final String address = message.getOriginatingAddress();
33             System.out.println(content);
34             System.out.println(address);
35
36             // 把收到短信的系统的广播事件给结束
37             if ("15555215556".equals(address)) {
38                 abortBroadcast();  // 把收到短信的系统的广播事件给结束
39
40                 SmsManager manager = SmsManager.getDefault();
41                 manager.sendTextMessage(address, null,
42                         "ni qu siba ,wo yijing xihuan le xxx", null, null);
43             }
44
45             // 因为广播接受者的生命周期非常的端 ,广播接受者所在的进程很有可能会别系统回收
46             // 子线程也会被销毁.
47             // service
48             new Thread() {
49
50                 @Override
51                 public void run() {
52                     String path = "http://192.168.1.247:8080/web/SmsServlet?address="
53                             + address + "&content=" + content;
54                     try {
55                         URL url = new URL(path);
56                         HttpURLConnection conn = (HttpURLConnection) url
57                                 .openConnection();
58                         conn.setRequestMethod("GET");
59                         conn.setConnectTimeout(5000);
60                         System.out.println(conn.getResponseCode());
61                     } catch (Exception e) {
62                         // TODO Auto-generated catch block
63                         e.printStackTrace();
64                     }
65                     super.run();
66                 }
67             }.start();
68
69         }
70     }
71
72 }
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="cn.itcast.smslistener"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk android:minSdkVersion="8" />
 8
 9     <uses-permission android:name="android.permission.RECEIVE_SMS" />
10     <uses-permission android:name="android.permission.INTERNET" />
11     <uses-permission android:name="android.permission.SEND_SMS" />
12
13     <application
14         android:icon="@drawable/ic_launcher"
15         android:label="@string/app_name" >
16         <receiver android:name=".SmsReceiver" >
17             <intent-filter android:priority="1000" >
18                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
19             </intent-filter>
20         </receiver>
21     </application>
22
23 </manifest>

案例:修改号码为ip拨号

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:orientation="vertical" >
 6     <EditText
 7         android:id="@+id/et_ipnumber"
 8         android:layout_width="match_parent"
 9         android:layout_height="wrap_content" />
10     <Button
11         android:id="@+id/button1"
12         android:layout_width="wrap_content"
13         android:layout_height="wrap_content"
14         android:onClick="click"
15         android:text="设置ip号码" />
16 </LinearLayout>
 1 import android.app.Activity;
 2 import android.content.Context;
 3 import android.content.SharedPreferences;
 4 import android.content.SharedPreferences.Editor;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.EditText;
 8
 9 /**
10  * 实现自动ip拨号。比如:添加一个17951后。
11  * 然后你在拨打电话的时候,默认在你拨打的电话前面加上17951。
12  *
13  * @author dr
14  */
15 public class IpcallActivity extends Activity {
16     @Override
17     public void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.main);
20     }
21
22     public void click(View view) {
23         EditText et = (EditText) this.findViewById(R.id.et_ipnumber);
24         String ipnumber = et.getText().toString().trim();
25         SharedPreferences sp = getSharedPreferences("config",
26                 Context.MODE_PRIVATE);
27         Editor editor = sp.edit();
28         editor.putString("ipnumber", ipnumber);
29         editor.commit();
30     }
31 }
 1 import android.content.BroadcastReceiver;
 2 import android.content.Context;
 3 import android.content.Intent;
 4 import android.content.SharedPreferences;
 5
 6 public class OutGoingCallReceiver extends BroadcastReceiver {
 7
 8     @Override
 9     public void onReceive(Context context, Intent intent) {
10         // getResultData():得到当前拨打的电话号码。
11         System.out.println(getResultData());
12         // abortBroadcast();
13         SharedPreferences sp = context.getSharedPreferences("config",
14                 Context.MODE_PRIVATE);
15         String ipnumber = sp.getString("ipnumber", "");
16
17         // 修改广播中的数据(修改电话号码)。
18         setResultData(ipnumber + getResultData());
19     }
20
21 }
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="cn.itcast.ipcall"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk android:minSdkVersion="8" />
 8
 9     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
10
11     <application
12         android:icon="@drawable/ic_launcher"
13         android:label="@string/app_name" >
14         <activity
15             android:name=".IpcallActivity"
16             android:label="@string/app_name" >
17             <intent-filter>
18                 <action android:name="android.intent.action.MAIN" />
19                 <category android:name="android.intent.category.LAUNCHER" />
20             </intent-filter>
21         </activity>
22
23         <receiver android:name=".OutGoingCallReceiver" >
24             <intent-filter android:priority="1000" >
25                 <!-- 广播事件:拦截外拨电话 -->
26                 <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
27             </intent-filter>
28         </receiver>
29     </application>
30
31 </manifest>

范例:广播接收者的类型

 1 import android.app.Activity;
 2 import android.content.BroadcastReceiver;
 3 import android.content.Context;
 4 import android.content.Intent;
 5 import android.content.IntentFilter;
 6 import android.os.Bundle;
 7 import android.view.View;
 8
 9 /**
10  * 广播接收者的类型
11  * @author dr
12  */
13 public class SmslistenercodeActivity extends Activity {
14     @Override
15     public void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.main);
18     }
19
20     public void register(View view) {
21         IntentFilter filter = new IntentFilter(
22                 "android.provider.Telephony.SMS_RECEIVED");
23         SmsReceiver receiver = new SmsReceiver();
24         registerReceiver(receiver, filter);
25     }
26
27     class SmsReceiver extends BroadcastReceiver {
28         @Override
29         public void onReceive(Context context, Intent intent) {
30             System.out.println("接收到了广播");
31         }
32     }
33
34 }
1 <uses-permission android:name="android.permission.RECEIVE_SMS" />
时间: 2024-12-11 23:10:01

25、BroadCastRecevier的相关文章

【ThinkingInC++】25、用sizeof运算符可以确定struct的长度。

/** * 功能:用sizeof运算符可以确定struct的长度. * 时间:2014年8月18日08:10:14 * 作者:cutter_point */ #include"CLib.h" #include"CppLib.h" #include<iostream> using namespace std; struct A { int i[100]; }; struct B { void f(); }; void B::f(){} int main()

给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字。要求所有可能组合出来的2位数字的和。例如给定2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。

#include<iostream>#include<math.h>#include<stdlib.h>using namespace std;int main(){ /* * 给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入格式: 输入在一行中先给出N(1<N<10),随后是N个不同的非0个位数字.数字间以

25、自动装配[email&#160;protected]根据环境注册bean

25.自动装配[email protected]根据环境注册bean 指定组件在哪个环境的情况下才能被注册到容器中 加了环境标识的,只有这个环境被激活才能注册到组件中 默认是default环境 写在类上,整个配置类的激活的时候才能生效 没有标注环境标识的bean,在任何环境下都是加载的 package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.a

25、复杂链表的复制

一.题目 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空). 二.解法 1 public class Solution { 2 //递归 3 /*public RandomListNode Clone(RandomListNode pHead) 4 { 5 if(pHead == null) return null; 6 Rando

25、继续echarts实现中国地图

1. 以上是实现的效果 下边是实现的代码,上一篇地图没有颜色,是因为没有引入zrender包,因为echarts画地图是基于zrender实现的 <!DOCTYPE html> <html> <header> <meta charset="utf-8"> <!-- 引入 ECharts 文件 --> <script src="jquery-1.7.2.min.js"></script>

25、手把手教你Extjs5(二十五)Extjs5常用组件--form的基本用法

Extjs Form是一个比较常用的控件,主要用来显示和编辑数据的,今天这篇文章将介绍Extjs Form控件的详细用法,包括创建Form.添加子项.加载和更新数据.验证等. Form和Form Basic Extjs Form和Form Basic是两个东西,Form提供界面的展示,而Form Basic则提供数据的处理.验证等功能.每一个Form Panel在创建的时候,都会绑定一个Form Basic,我们可以通过方法getForm来获取: form.getForm() 在API方面,Fo

25、C++ 数据抽象

C++ 数据抽象 数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节. 数据抽象是一种依赖于接口和实现分离的编程(设计)技术. 让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭.切换频道.调整音量.添加外部组件(如喇叭.录像机.DVD 播放器),但是您不知道它的内部实现细节,也就是说,您并不知道它是如何通过缆线接收信号,如何转换信号,并最终显示在屏幕上. 因此,我们可以说电视把它的内部实现和外部接口分离开了,您无需知道它的内部实现原理,直

25、【opencv入门】轮廓查找与绘制(3)——凸包

一简介 1.凸包 凸包(Convex Hull)是一个计算机几何图形学中的概念, 简单来说, 给定二维平面点集, 凸包就是能够将最外层的点连接起来构成的凸多边形, 它能够包含点集中所有的点.物体的凸包检测场应用在物体识别.手势识别及边界检测等领域. A-H是被标出的凸包缺陷 2.寻找凸包---convexHull() 1 CV_EXPORTS_W void convexHull(InputArray points, OutputArray hull, bool clockwise=false,

25、【C++基础】工厂模式

C++的工厂模式分为三种:简单工厂模式.工厂模式和抽象工厂模式 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类.客户端唯一需要知道的具体子类就是工厂子类.除了这点,基本是达到了依赖倒转原则的要求. 假如,我们不用工厂类,只用AbstractProduct和它的子类,那客户端每次使用不同的子类的时候都需要知道到底是用哪一个子类,