广播 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也同时死亡掉。
本文参考链接: