广播 broadcast 接收的方式

1.在描述文件中注册接收程序

首先创建一个接收程序,只需拓展BroadcastReceiver类并改写onReceieve()方法,如MySMSMonitor

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class MySMSMonitor extends BroadcastReceiver {
    //接收短信广播
    private static final String  ACTION="android.provider.Telephony.SMS_RECEIVED";    
    @Override
    public void onReceive(Context context, Intent intent) {
        
       if(intent!=null && intent.getAction()!=null&&ACTION.compareToIgnoreCase(intent.getAction())==0){
           Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
           SmsMessage[] messages = new SmsMessage[pduArray.length];
           StringBuffer sb = new StringBuffer(5000);
           for(int i=0;i<pduArray.length;i++){
               messages[i]=SmsMessage.createFromPdu((byte[])pduArray[i]);
               Log.i("sms1", messages[i].getOriginatingAddress());
               Log.i("sms1", messages[i].getMessageBody());
               sb.append(messages[i].getMessageBody());
               Toast.makeText(context, messages[i].toString(), Toast.LENGTH_SHORT).show();
           }
           Log.i("sms1", "sms message received");
           if(sb.length()!=0){
               //如果拿到数据,传到其他activity
               Intent i = new Intent(context, Test.class);
               i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               i.putExtra("message", sb.toString());
               context.startActivity(i);
           }
       }
    }

}

 在manifest.xml注册该接收程序

<receiver android:name=".MySMSMonitor">
            <intent-filter  android:priority="10000">
                <action                        android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

 可以通过在intent-filter中设置android:priority属性来设置receiver的优先级。值越大优先级越大。这种方式的注册在整个程序运行过程中都会监听。


2.在程序中通过registerReceiver()注册

首先在程序中定义一个BroadcastReceiver类型的变量,如下:

 public  BroadcastReceiver receiver= new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Log.i("msg", intent.getAction());
            if(intent!=null && intent.getAction()!=null&&ACTION.compareToIgnoreCase(intent.getAction())==0){
                Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
                SmsMessage[] messages = new SmsMessage[pduArray.length];
                 sb = new StringBuffer(5000);
                for(int i=0;i<pduArray.length;i++){
                    messages[i]=SmsMessage.createFromPdu((byte[])pduArray[i]);
                    Log.i("sms1", messages[i].getOriginatingAddress());
                    Log.i("sms1", messages[i].getMessageBody());
                    sb.append(messages[i].getMessageBody());
                    Toast.makeText(context, messages[i].toString(), Toast.LENGTH_SHORT).show();
                }
                Log.i("sms1", "sms message received");
                Log.i("msg", sb.toString());
                getMessage(sb.toString());
            }
        }
    };

 然后在程序中oncreate()函数声明注册接收,如下

 IntentFilter filter = new IntentFilter();
 filter.addAction("android.provider.Telephony.SMS_RECEIVED");
 filter.setPriority(Integer.MAX_VALUE);
 this.registerReceiver(receiver, filter);

 通过 addAction()说明监听的广播,通过setPriority设置监听器的优先级。在网上看到些文章说值为10000,优先级最高,后来测试知道最大值可以设置为整型的最大值,也就是Integer.MAX_VALUE,这样才是最大的。在做短信拦截的时候,发现有时候手机拦截不到信息,通过查找发现,假设手机上装了移动通讯录,QQ通讯录等等通讯录,有可能是会拦截不到信息。因为这些通讯录可能将它们的监听器优先级设置到很大,优先级数值相同的监听器,后来注册的优先级更高。如两个监听器A,B,优先级都是10,A先注册,B后注册。那么短信来的时候,是B先拦截到,再传到A。而且发现这些通讯录注册多次监听器,所以我的代码里也要多次注册监听器,争取是最后一个注册的,这样子才比较有希望拦截到短信。因为,那些通信录拦截到短信后,把广播截断了,不往下传了。

注册完了,也要反注册。在这个activity销毁后,也把监听器回收。

@Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }

 通过,unregisterReceiver()函数就可以反注册监听器。

注意1:程序中手动注册的BroadcastReceiver,并不会重新实例化的。这点和AndroidManifest.xml不一样
注意2:它的存活时间是要一直到Activity死亡。如果调用了finish(),该Activity就死亡,receiver也同时死亡掉。

本文参考链接:

http://blog.csdn.net/hudashi/article/details/6915829

猜你喜欢

转载自little-r.iteye.com/blog/1626676