举例讲解Android应用开发中OTTO框架的基本使用

2019-12-10 19:05:20王冬梅

public class SmsService extends Service {

 private SmsReceiver mReceiver = null;

 public SmsService() {
 }

 @Override public IBinder onBind(Intent intent) {
  // TODO: Return the communication channel to the service.
  throw new UnsupportedOperationException("Not yet implemented");
 }

 @Override public void onCreate() {
  super.onCreate();
  Log.d(TAG, "onCreate");
  IntentFilter iFilter = null; // 意图过滤对象
  mReceiver = new SmsReceiver(); // 广播接收类初始化
  iFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
  iFilter.setPriority(Integer.MAX_VALUE); // 设置优先级
  GlobalContext.getBusInstance().register(mReceiver);//注册Bus
  registerReceiver(mReceiver, iFilter); // 注册广播
 }

 @Override public void onDestroy() {
  super.onDestroy();
  if (mReceiver != null){
   GlobalContext.getBusInstance().unregister(mReceiver);//取消注册Bus
   unregisterReceiver(mReceiver);
  } 
 }
}

接下来就是真正的发布者SmsReceiver了,大部分代码与网上都是一样的,注意看我是如何发布消息的。

public class SmsReceiver extends BroadcastReceiver {

 public SmsReceiver() {
 }

 @Override public void onReceive(Context context, Intent intent) {

  Bundle bundle = intent.getExtras();
  //获取链路层的协议数据单元
  Object[] messages = (Object[]) bundle.get("pdus");
  SmsMessage[] sms = new SmsMessage[messages.length];
  // Create messages for each incoming PDU
  for (int n = 0; n < messages.length; n++) {
   sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
  }
  for (SmsMessage msg : sms) {
   //TODO: 这里应该加上你自己的过滤条件,比如手机号,短信内容
   //尽可能的拦截短信,这个命令在MIUI,flyme上都没有用
   abortBroadcast();
   GlobalContext.getBusInstance().post(msg);
  }
 }
}

从代码中可以看出,在Service中,我们控制了SmsReceiver中BUS的生命周期,之后在SmsReceiver中,通过post把消息发布出去