1.BroadcastReceiver简介:
BroadcastReceiver 广播接收器,这个组件本质上就是一种全局监听器,用于监听全局广播(Broadcast)消息,因此它可以非常方便的实现系统不同组件之间的通信。
BroadcastReceiver这个监听器与普通的onXxxListener监听器是不同的,onXxxListener是属于应用程序级别的监听器,当程序退出的时候那么这个监听器也就随之结束了。而BroadcastReceiver(配置文件中注册)属于系统级别的监听器,它拥有自己的进程,只要存在与之匹配的Broadcast以intent形式传递过来,那么BroadcastReceiver就会被激活。
与Activity不同的是,当系统通过Intent启动指定的Activity组件时,如果系统没有找到目标Activity组件,这时就会发生程序异常中断,但系统通过Intent激活BroadcastReceiver时,即使没有找到目标BroadcastReceiver时,系统也不会有任何问题
2.创建BroadcastReceiver
2.1 首先需要继承BroadcastReceiver类,重写这个类里面的onReceive()方法,代码如下:
1 package com.example.administrator.broadcastreceivertest; 2 3 import Android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.util.Log; 7 import android.widget.Toast; 8 9 10 public class MyBroadcastReceiver extends BroadcastReceiver{ 11 public MyBroadcastReceiver() { 12 Log.i("tag","创建构造器..."); 13 } 14 15 @Override 16 public void onReceive(Context context, Intent intent) { 17 String msg = intent.getStringExtra("msg"); 18 Toast.makeText(context,msg,Toast.LENGTH_SHORT).show(); 19 } 20 }
当一个BroadcastReceiver被激活之后,系统会为之创建一个BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法被执行完后,BroadcastReceiver实例就会被销毁。如果BroadcastReceiver的onReceive()方法不能在10s内执行完成,Android会认为该程序无响应,所以不要在onReceive()方法中执行耗时操作,否则会弹出ANR(Application No Response)对话框。
如果在onReceive()方法中需要执行耗时操作,可以考虑使用Intent启动一个Service来完成操作,此时不应该考虑启动一个新的线程去处理耗时操作,因为BroadcastReceiver的生命周期很短,可能子线程还没有结束,BroadcastReceiver就已经退出了。而如果BroadcastReceiver所在的进程结束了,那么该线程就会标记为一个空线程。根据Android内存管理策略,在系统内存紧张时,会根据优先级首先结束优先级低的线程,而空线程优先级无疑是拥有最低的优先级,系统回收后,线程就无法完成相关操作了
2.2 注册BroadcastReceiver
注册BroadcastReceiver的两种方式:
1>使用代码进行指定(动态注册),调用Context类提供的registerReceiver(BroadcastReceiver receiver,IntentFilter filter);代码如下
1 MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver(); 2 IntentFilter filter = new IntentFilter(SHOW_MESSAGE); 3 registerReceiver(myBroadcastReceiver,filter);
IntentFilter 是根据SHOW_MESSAGE用来匹配Broadcast的,SHOW_MESSAGE是一个自定义的静态字符串常量。
要注意的是,BroadcastReceiver注册的地方,google 官方指出:
Note: If registering a receiver in your implementation, you should unregister it in . (You won't receive intents when paused, and this will cut down on unnecessary system overhead). Do not unregister in , because this won't be called if the user moves back in the history stack.
意思大概是:如果你要在Activity类中的onResume()方法中注册一个receiver,你也应该在Activity类onPause()方法中取消注册。不要在onSaveInstanceState()方法中取消注册,因为如果用户退出当前Activity(从task中移除Activity)时,那么这个BroadcastReceiver也将不能被激活。
特点:当应用程序关闭后,就不再监听。对于我们开发的App来说,越省电就会越受用户的欢迎,所以对于那些没有必要在应用程序退出后仍然进行监听的receiver,在代码中注册是一个不错的选择
2>在AndroidManifest.xml中注册(静态注册),代码如下: