当前位置:操作系统 > 安卓/Android >>

android短信和广播机制

广播介绍


广播被分为两种不同的类型,“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数据大优先级别越高,取值范围:-1000到1000也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。

 

Context.sendBroadcast()发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast() ),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存进广播Intent,然后传给下一个接收者。

sendStickyBroadcast() 意思只要是如果发送广播之后才执行registerReceiver(BroadcastReceiver,IntentFilter).这个方法依然可以接受到。换句话说,在ReceiverActivity里是通过代码来注册Recevier而不是在Manifest里面注册的。sendStickyBroadcast发出的最后一个Intent会被保留,当下次Recevier处于活跃的时候,又会接受到它。需要加BROADCAST_STICKY权限,否则会抛SecurityException

 

 


安卓手机中的短信适合用广播来监测,需要注册广播。此外还可以用来过滤短信,可根据内容和电话号码来过滤短信

把主要代码传上来存盘,方便以后忘记时上来取

 

 

首先:订阅感兴趣的广播 Intent ,订阅方法有两种:

第一种:使用代码进行订阅

Java代码

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 

registerClass receiver = new registerClass(); 

registerReceiver(receiver, filter); 

 

第二种:在 AndroidManifest.xml 文件中的 <application> 节点里进行订阅 :

Html代码

<receiver android:name=".IncomingSMSReceiver"> 

<intent-filter> 

<action android:name="android.provider.Telephony.SMS_RECEIVED"/> 

</intent-filter> 

</receiver> 


我用第二种

 


package com.lan.www;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
// 这是那个广播类,需继承系统的
public class SmsReciver extends BroadcastReceiver {
    private final String MagicString = "lan";
   


//onReceive的生命周期为10秒,所以里面的操作不能超过10秒


    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        if((intent.getAction()!=null)&&(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))) //这个action是系统短信专属
        {
            StringBuffer sb = new StringBuffer();
            Bundle bundle = intent.getExtras();  //如果有短信过来,Android系统其实就是用一个Bundle来存短信的
            if(bundle!=null)
            {
            //短信头是一个pdus
                Object[] pdus = (Object[]) bundle.get("pdus");  //一条短信(中文是70个字符左右,英文是140左右,都包括了标点符号),可能不只一条,但每一条都有pdus
               
                SmsMessage[] msgs = new SmsMessage[pdus.length];  //有多少条短信就有多少条短信
                for (int i = 0; i < msgs.length; i++) {
                //短信内容
                    msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }
                //得到电话号码,一般取第一条短信的电话号码就可以了,要想严谨就应该每条短信都应该进行取电话号码,因为这时可能其他人也在发短信过来,
                String telnumber = msgs[0].getOriginatingAddress();
                for (SmsMessage smsMessage : msgs) {
                    sb.append(smsMessage.getMessageBody());
                }

               if(smgs.length() >0){


                  Date date = new Date(smgs[0].getTimestampMillis());
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               String time = format.format(date);  //得到发送时间

                 }

 

                Log.i("lan", "SMS telnumber="+telnumber+" info="+sb.toString());
                //过滤短信
                if(sb.indexOf(MagicString)!=-1)
                {
                //有过滤的短信内容在里面就清除
                    sb = null;
                    //阻止广播播出
                    this.abortBroadcast();
                }
                if(sb!=null&&sb.length()!=0)
                {
                    Inte

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,