BroadcastRecevier的有序、普通、动态和静态启动以及数据传递
1、什么是BroadcastRecevier?
BroadcastRecevier是一个系统级别的监听器,比如:插上耳机、电池电量发生变化、切换飞行模式等等都会由系统发送广播,我们的App可以接收过个广播,并做出相应的响应。
2、广播发送的两种类型:
A) 发送普通广播:sendBroadcast(Intent intent);
B) 发送有序广播:sendOrderedBroadcast(intent, receiverPermission)
3、BroadcastReceiver的生命周期很短,只有10秒左右,如果在广播中要完成一个耗时的任务,可以将该任务通过Service去完成。
4:每一个广播都通过一个Action字符串进行标识。
5:动态广播必须使用代码注册和反注册广播,如果要想在BroadcastRecevier中访问Activity,可以将该BroadcastRecevier定义成为Activity的一个内部类。动态广播无需在AndroidManifest.xml中配置。
6、说明:当系统中的某个App删除后,会发送android.intent.action.PACKAGE_REMOVED广播,广播接收器MyBroadcastReceiver会接收该广播,并自动调用onReceive方法。
实例:
/**
* BroadcastRecevier的简单使用:
* 1:动态启动:可实例化广播类
* 2:静态启动:无法接受接口返回的数据
* 3:普通启动:配置文件的action要和代码里面的action一致
* @author Administrator
*
*/
public class MainActivity extends Activity implements SendData{
MyBroadcastRecevier myb;//广播类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout. activity_main);
}
/**
* 动态启动,可通过接口传递数据 *
* @param v
*/
public void but1(View v) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED );//系统广播
myb = new MyBroadcastRecevier ();
registerReceiver( myb, intentFilter); //注册,动态启动广播
myb.setSd( this); //绑定set
}
/**
* 静态启动,不能通过接口传递数据(因为我们无法实例化(系统自动实例化),所以无法用接口传递或返回数据)
* @param v
*/
public void but2(View v) {
Intent intent = new Intent(MyBroadcastRecevier. ACTION); //自定义广播
intent.putExtra( "name", "sunshine");
this.sendOrderedBroadcast(intent, null); //有序广播
}
/**
* 普通,静态启动广播
* <receiver android:name="com.example.mytest4.MyBroadcastRecevier"
* android:exported="true">
* <intent-filter >
* <action android:name="android.intent.action.EDIT" />
* </intent-filter>
* </receiver>
* @param v
*/
public void but3(View v) {
Intent intent = new Intent();
intent.setAction(Intent. ACTION_EDIT); //要和AndroidManifest.xml里的保持一致
MainActivity. this.sendBroadcast(intent); //广播
}
@Override
protected void onStop() {
super.onStop();
if( myb != null){
//反注册,否则会无限调用
unregisterReceiver( myb);
}
}
/**
* 通过接口将数据返回
*/
@Override
public void data(String s) {
if(s!= null){
Log. e("tag: " , s);
Toast. makeText(getApplicationContext(), s, 1000).show();
}
}
}
----------
public class MyBroadcastRecevier extends BroadcastReceiver {
protected static final String ACTION = MyBroadcastRecevier.class.getName();//获得完整类名
private static final String TAG = MyBroadcastRecevier.class.getSimpleName();//获得类名
private SendData sd;
public void setSd(SendData sd) {
this. sd = sd;
}
/**
* 广播自动调用该方法
*/
@Override
public void onReceive(Context arg0, Intent intent) {
/**
* 动态启动传值
*/
/*Bundle bundle = intent.getExtras();
// 获取当前电量
int current = bundle.getInt("level");
// 获取总电量(电池的电池容量)
int total = bundle.getInt("scale");
sd.data("当前电量:" + current + ",总电量:" + total);*/
/**
* 静态启动传值
*/
String s = intent.getStringExtra( "name");
Log. e(TAG, "广播启动成功: " + s);
Toast. makeText(arg0, "=======", 1000);
}
/**
* 传值接口
*
* @author Administrator
*
*/
public interface SendData {
public void data(String s);
}
}
----------
配置BroadcastRecevier:
<receiverandroid:name="com.example.mytest4.MyBroadcastRecevier"
android:exported= "true">
<intent-filter >
<action android:name= "com.example.mytest4.MyBroadcastRecevier" />
</intent-filter >
</receiver >
小案例:插入耳机时界面现红色,拔出耳机现白色
public class MainActivity extends Activity {
private LinearLayout layout;
private BackgroundReceiver br;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = (LinearLayout) findViewById(R.id.layout);
br = new BackgroundReceiver();
}
@Override
protected void onStart() {
super.onStart();
//注册广播
IntentFilter filter = new IntentFilter();
//在耳机口上插入耳机时发出的广播
filter.addAction(Intent.ACTION_HEADSET_PLUG);
//注册
this.registerReceiver(br, filter);
}
@Override
protected void onStop() {
super.onStop();
//反注册
unregisterReceiver(br);
}
/**
* 广播接收器,Activity的内部类
* @author 手撕包菜
*
*/
class BackgroundReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.hasExtra("state")){
int state = intent.getIntExtra("state", 0);
if(state == 0){
//如果耳机被拨出,背景变白
layout.setBackgroundColor(Color.WHITE);
Toast.makeText(getApplicationContext(), "耳机被拨出", 1000).show();
}else{
//如果耳机被插入,背景弯红
layout.setBackgroundColor(Color.RED);
Toast.makeText(getApplicationContext(), "耳机插入", 1000).show();
}
}
}
}
}
源码下载地址:
http://download.csdn.net/detail/sunshine_mood/9418381
效果图:
小案例效果图: