转载时请注明转自: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)利用 IntentFilter 和 BroadcastReceiver 绑定注册一个 BroadcastReceiver 。
代码如下:
当要解除BroadcastReceiver对象的注册时,可执行以下代码:
注意:当如果要进行的操作需要花费比较长的时间,则不适合放在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时,其代码如下:
但至于为什么需要使用service.setFlags(Intent. FLAG_ACTIVITY_NEW_TASK ); 目前还没完全理解,这个setFlags还没有特别明白,以后再补充,或看到的看官,如果知道可以留言补充!