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

来源:互联网 发布:收纳好物 知乎 编辑:程序博客网 时间:2024/04/29 10:45

    

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

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

 

 

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

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

注:

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

 

 

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

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

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

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

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

 

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

   1)生成一个BroadcastReceiver对象;

   2)生成一个IntentFilter对象;

   3)为IntentFilter对象添加一个Action

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

代码如下:

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

 

 

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

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

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

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