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

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

首先布局页面(textview.xml)

布局页面只有一个TextView,显示“等待接收......“

android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical">

android:layout_height="wrap_content">
    


主程序(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{
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,首先需要添加权限


然后注册Activity和Recevier








     



这样程序运行起来之后就会看到TextView, 
中的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的销毁方式等内容,我将在以后的文章中提到,请大家期待吧。

你可能感兴趣的:(Android)