BroadcastReceiver使用之一(常驻BroadcastReceiver接收短信)

从 “您有一条短信”这个最常见的手机服务开始,本程序设计了一个可以接收短信的程序,将捕捉到的短信广播信息,拆解为可阅读的消息正文,而后以Toast的方式输出至手机。
在Android操作系统中,有很多电话相关时间(Telephony Event)会对系统发送信息,短信事件也不发生异常,当系统受到(Receiver)信息后,会由负责此项功能的Intent接手处理。如果想在自己程序中捕捉短信的广播信息,需要集成BroadcastReceiver对象来聆听短信服务。手机接到短信,会在Notification中提示摘要,一般格式电话号码:内容摘要。
本程序模拟受到一条短信信息,然后以Toast方式提示给用户,处理程序如下:

首先布局页面(textview.xml)

布局页面只有一个TextView,显示“等待接收......“
<?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="wrap_content"
android:orientation="vertical">

<TextView android:id="@+id/TextView01" android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>    
</LinearLayout>

主程序(BroadCastTest.java):
package test.shi;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;

public class BroadCastTest extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.textview);

TextView txt=(TextView)findViewById(R.id.TextView01);
txt.setText("等待接收......");
}

}

重要的是下面的这个类,它继承了BroadcastReceiver,重写了onReceive方法,在这个方法中将信息进行过滤并拼接成我们能读懂的内容。
BroadCastGet.java


package test.shi;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.sax.StartElementListener;
import android.telephony.SmsMessage;
import android.widget.Toast;


public class BroadCastGet extends BroadcastReceiver {

/*声明静态字符串,并使用android.provider.Telephony.SMS_RECEIVED
作为Action为短信的依据*/
  private static final String mACTION=
"android.provider.Telephony.SMS_RECEIVED";



@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub

if(intent.getAction().equals(mACTION))
{

StringBuilder sb=new StringBuilder();
Bundle bundle=intent.getExtras();
if(bundle!=null)
{
Object[] obj=(Object[])bundle.get("pdus");

//构建信息对象
SmsMessage[] message=new SmsMessage[obj.length];
for(int i=0;i<obj.length;i++)
{
message[i]=SmsMessage.createFromPdu((byte[])obj[i]);
}

for(SmsMessage currentMessage:message)
{
sb.append("接收到来自:/n");                    
//发送人的电话号码
sb.append(currentMessage.getDisplayOriginatingAddress());
sb.append("/n-------传来的信息---------/n");
//发送的信息内容
sb.append(currentMessage.getDisplayMessageBody());

}
}
//以Notification显示来讯信息
Toast.makeText(context,sb.toString(), Toast.LENGTH_LONG).show();

//返回主程序BroadCastTest
Intent i=new Intent(context,BroadCastTest.class);
//以一个全新的任务来运行
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);

}
}

}


AndroidManifest.xml中需要注册Activity和Recevier,首先需要添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

然后注册Activity和Recevier
<activity android:name="BroadCastTest">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="BroadCastGet">
<intent-filter>
      <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

这样程序运行起来之后就会看到TextView, 
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
中的name值必须跟BroadCastGet.java中的

private static final String mACTION=
"android.provider.Telephony.SMS_RECEIVED";
值匹配,否则无法正确接受信息。


我们利用Eclipse自带的Emulator Control窗口来模仿发送信息,如果你的Eclipse中看不到
Emulator Control窗口,可以在菜单Window->show view->others...中找到,打开Emulator Control,会看到如下的图形。




点击send可以发送信息,运行后的界面如下:





此程序中注册的BroadcastReceiver属于常驻类型,即不会自动销毁,必须手动移除这个项目才行,至于BroadcastReceiver的销毁方式等内容,我将在以后的文章中提到,请大家期待吧。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值