Mars Android视频学习笔记——01_21/22_广播机制

转载时请注明转自:http://blog.csdn.net/sam_zhang1984

交流可加新浪微博:Android开发人

 

 

Android中的广播,可以理解成系统发出的消息,我们通过接收这些广播可以进行相应的处理。

    为了要接收系统的广播,需要继承 BroadcastReceiver ,生成自己的类,并覆写其 onReceive 方法,这个方法就是进行消息处理的实体,即用于接收消息并进行相应处理,代码如下:

  1. public class MyBroadcastReceiver extends BroadcastReceiver{  
  2. public void onReceive(Context context, Intent intent) {  
  3. //对接收到的广播进行相应的处理   
  4. }  
  5. }  

注:

    广播接收类在执行完 onReceive 后,这个类就没用了,就成为垃圾对象了,如果再次接收到广播时,将再重新生成一个 BroadcastReceiver 对象。

 

 

   每个BroadcastReceiver对象分别用来处理不同的广播事件,如何来区分每个BroadcastReceiver对象所接收的广播,就需要对BroadcastReceiver对象进行注册。BroadcastReceiver对象注册有两种方法:一种是在 Manifest.xml 文件中注册;另一种是在代码中注册。

     这两种注册方法的区别是:

   1、在 Manifest.xml 中把我们生成的广播接收类注册到 Android 系统中去,并声明其所要接收的广播。用这种注册方法即使你的应用程序被关闭,你的 BroadcastReceiver 仍然会接收到系统的广播。

   在Manifest.xml中注册的代码是:

  1. <!-- 注册一个广播监听器 -->  
  2.          <receiver android:name = ".MyBroadcastReceiver">  
  3.             <intent-filter>  
  4.                 <action android:name = "android.provider.Telephony.SMS_RECEIVED"/>  
  5.             </intent-filter>   
  6.         </receiver>     

    2、在代码中注册 BroadcastReceiver ,则在程序被关闭时, BroadcastReceiver 不再接收系统的广播。通常利用 BroadcastReceiver 更新 UI 时,会使用这种注册,因为一个 Activity 里的 UI 只有看得见的时候更新才有意义,如果程序关闭了更新就没意义了,这种情况下,就在 Activity 启动时进行注册,而在 Activity 不可见时取消注册。

 

   利用代码注册 BroadcastReceiver 时有以下步骤:

   1)生成一个 BroadcastReceiver 对象;

   2)生成一个 IntentFilter 对象;

   3)为 IntentFilter 对象添加一个 Action

   4)利用 IntentFilter BroadcastReceiver 绑定注册一个 BroadcastReceiver

代码如下:

  1. //生成一个BroiadcastReceiver对象   
  2.             smsReceiver = new SMSReceiver();  
  3.             //生成一个IntentFilter对象   
  4.             IntentFilter filter = new IntentFilter();  
  5.             //为IntentFilter添加一个Action   
  6.             filter.addAction(SMS_ACTION);  
  7.             //将BroadcastReceiver对象注册到系统当中   
  8.             TestBC2Activity.this.registerReceiver(smsReceiver, filter);  

   当要解除BroadcastReceiver对象的注册时,可执行以下代码:

  1. //解除BroadcastReceiver对象的注册   
  2.             TestBC2Activity.this.unregisterReceiver(smsReceiver);  

 

 

    注意:当如果要进行的操作需要花费比较长的时间,则不适合放在BroadcastReceiver中进行处理,引用网上找到的一段解释:

    “在 Android 中,程序的响应( Responsive )被活动管理器( Activity Manager )和窗口管理器( Window Manager )这两个系统服务所监视。当 BroadcastReceiver 10 秒内没有执行完毕, Android 会认为该程序无响应。所以在 BroadcastReceiver 里不能做一些比较耗时的操作,否侧会弹出 ANR Application No Response )的对话框。如果需要完成一项比较耗时的工作,应该通过发送 Intent Service ,由 Service 来完成。而不是使用子线程的方法来解决,因为 BroadcastReceiver 的生命周期很短(在 onReceive() 执行后 BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束 BroadcastReceiver 就先结束了。如果 BroadcastReceiver 结束了,它的宿主进程还在运行,那么子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

      所以如果要进行的操作占用时间比较长,最好能调用新的Activity或Service进行处理,在调用Intent调用新的 Activity或Service时,其代码如下:

  1. Intent myIntent = new Intent();  
  2. //通过Intent对象把信息的内容和发送人的号码发给新的Activity   
  3.             myIntent.putExtra("SMSBody", strSMSBody);  
  4.             myIntent.putExtra("SMSAdress", strSMSAdress);  
  5.             //从Service或BroadcastReciver往Activity跳转时,要将Intent的Flag设置为FLAG_ACTIVITY_NEW_TASK才可以   
  6.             myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    
  7.             myIntent.setClass(context, BroadcastActivity.class);  
  8.             context.startActivity(myIntent);  

      但至于为什么需要使用service.setFlags(Intent. FLAG_ACTIVITY_NEW_TASK ); 目前还没完全理解,这个setFlags还没有特别明白,以后再补充,或看到的看官,如果知道可以留言补充!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值