Android简明开发教程二十:Broadcast Receiver 短信触发示例

jerry Android 2015年08月24日 收藏

Android 中BroadCast Receiver可以用来侦听广播事件。在使用Broadcast 之前,必须使用代码或是在AndroidManifest.xml进行注册。

下面的例子实现使用短信来触发AndroidGraphics2DTutorial中的示例。短信格式为:@demo:xxxx ,xxxx为 示例名称,比如, 启动Colors示例, 则向手机发送: @demo:Colors . 手机在收到短信后,先检测短信格式是否符合 @demo:xxxx, 若符合,这启动对应的示例。

在AndroidGraphics2DTutorial中添加一个自定义的Broadcast Receiver SmsMessageReceiver 用于监测接受到的短信:

  1. public class SmsMessageReceiver extends BroadcastReceiver {
  2. private static final String queryString="@demo:";
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. Bundle extras = intent.getExtras();
  6. if (extras == null)
  7. return;
  8.  
  9. Object[] pdus = (Object[]) extras.get("pdus");
  10.  
  11. for (int i = 0; i < pdus.length; i++) {
  12. SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
  13. String fromAddress = message.getOriginatingAddress();
  14. String fromDisplayName = fromAddress;
  15. String msg=message.getMessageBody();
  16. if(msg.startsWith(queryString)){
  17. // Trigger the main activity to fire up a dialog
  18. //that shows/reads the received messages
  19. Intent di = new Intent();
  20. di.setClass(context, AndroidGraphics2DTutorial.class);
  21. di.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
  22. | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  23. di.putExtra(AndroidGraphics2DTutorial.SMS_FROM_ADDRESS_EXTRA,
  24. fromAddress);
  25. di.putExtra(AndroidGraphics2DTutorial.SMS_FROM_DISPLAY_NAME_EXTRA,
  26. fromDisplayName);
  27. di.putExtra(AndroidGraphics2DTutorial.SMS_MESSAGE_EXTRA, msg);
  28. context.startActivity(di);
  29. }
  30.  
  31.  
  32. }
  33. }
  34. }

onReceive 会在Broadcast 事件发生是执行,这里检测短信内容,如果是以@demo:开头的,则启动AndroidGraphics2DTutorial Main Activity。

修改AndroidMainifest.xml

  1. <receiver android:name=".SmsMessageReceiver" android:enabled="true">
  2. <intent-filter>
  3. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  4. </intent-filter>
  5. </receiver>

同时添加permission ,和Java ME类似Android某些API需要指定对应的Permission才可以使用。

  1. <uses-permission android:name="android.permission.SEND_SMS" />
  2. <uses-permission android:name="android.permission.RECEIVE_SMS" />

修改AndroidGraphics2DTutorial.java 来处理SMS消息:

  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Resources res = getResources();
  4. String[] activity_Names = res.getStringArray(R.array.activity_name);
  5. String[] activity_Infos = res.getStringArray(R.array.activity_info);
  6. for(int i=0;i<activity_Names.length;i++){
  7. ActivityInfo activityInfo=new ActivityInfo();
  8. activityInfo.activityName=activity_Names[i];
  9. activityInfo.activityInfo=activity_Infos[i];
  10. activityInfo.iconIndex=R.drawable.icon1+i;
  11. activityInfos.add(activityInfo);
  12. }
  13. aa=new ActivityInfoAdapter(this,R.layout.activitylist,activityInfos);
  14. setListAdapter(aa);
  15. Bundle bundle=getIntent().getExtras();
  16. if(bundle!=null){
  17. mFromAddress = bundle.getString(SMS_FROM_ADDRESS_EXTRA);
  18. mMessage = bundle.getString(SMS_MESSAGE_EXTRA);
  19. int index=mMessage.indexOf(queryString);
  20. if(index>=0){
  21. String demoName=mMessage.substring(index+queryString.length());
  22. Intent intent = new Intent();
  23. intent.setClassName(this, packgeName+".example." +demoName);
  24. startActivity(intent);
  25. }
  26. }
  27. }

下面来测试,如果使用设备,则给手机发送@demo:Colors .
如果使用模拟器,则可以启动两个模拟器:

模拟器左上角数字5554,5556为模拟器的号码。发送@demo:Paths ,则自动触发Paths示例,如果AndroidGraphics2DTutorial没有运行,手机收到SMS短信后,会自动启动应用。