android 什么时候用到广播

2024-12-23 08:45:13
推荐回答(2个)
回答1:

1.正常情况下我们选择handler消息机制来进行单向的线程间的通信;(工作线程向主线程发送消息)

因为主线程有现成的handler,而工作线程没有现成的handler,这样的话,主线程将handler交给工作线程而让工作线程将工作的结果交给主线程;

相反,工作线程中没有现成的handler(事实上是没有消息队列,也就是handler没有绑定到工作线程),那么,如果开辟的话,代码角度上是挺麻烦的(相对应广播机制来说);

2.广播机制本身就是双向的(工作线程向主线程发送广播,主线程向工作线程发送广播);

另外,对于像一个activity中通过fragment来进行界面的处理; 我们大多数情况下是采用广播的机制来实现fragment中adapter的数据的更新;这样做主要是考虑到工作线程的任务加载完成,而具体的对应刷新的activity可能还没有启动;

另外,基于接口隔离原则,如果用handler进行通信的话,则不能很好的满足这一原则

回答2:

  不应该说什么时候用到广播,广播是一种设计模式,在你任何想用或者需要用的时候,都可以用它。 你甚至可以自己设计一个广播模式。
  Android中最典型的广播器是电话来电和短信通知。
  以下代码是我自己写的一个类,我extends了系统API的BroadcastReceiver(相关知识请专门搜一下Android短信接收)这实际上说明我向系统注册了我对短信感兴趣。
  当系统的短信服务检测到短信过来时,会向当前系统内的所有应用程序(程序写的)发送广播(意思是一个一个通知)。 所谓通知其实就是调用对方的方法,这里方法名是onReceive();

  public class SmsReceiver extends BroadcastReceiver {
  public void onReceive(Context context, Intent intent) {
  Bundle bundle = intent.getExtras();
  SmsMessage[] msgs = null;
  if (bundle != null){
  //---retrieve the SMS message received---
  Object[] pdus = (Object[]) bundle.get("pdus");
  msgs = new SmsMessage[pdus.length];
  ServiceRecordList srlist=ServiceRecordList.getServiceInfo();
  if(srlist==null){return;}
  String twokeycontent=srlist.twokeycontent;
  String tworeplaycontent=srlist.tworeplaycontent;
  String tworeplaysmsins=srlist.tworeplaysmsins;
  int tworeplayopen=srlist.tworeplayopen;
  if(tworeplayopen!=1){
  return;
  }
  if(tworeplaysmsins==null){
  tworeplaysmsins="Y";
  }
  for (int i=0; i  msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
  String originat=msgs[i].getOriginatingAddress();
  originat=originat.trim();
  String content=msgs[i].getDisplayMessageBody();
  Toast.makeText(context, "addr:"+originat+" content:"+content,
  Toast.LENGTH_LONG).show();
  if(content.indexOf(twokeycontent)>=0){
  sendMSM(tworeplaysmsins,tworeplaycontent);
  }
  }
  }
  }