从 “您有一条短信”这个最常见的手机服务开始,本程序设计了一个可以接收短信的程序,将捕捉到的短信广播信息,拆解为可阅读的消息正文,而后以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的销毁方式等内容,我将在以后的文章中提到,请大家期待吧。
BroadcastReceiver使用之一(常驻BroadcastReceiver接收短信)
最新推荐文章于 2021-05-26 05:49:33 发布