BroadcastReceiver的学习使用

今天开始要来学习一下Android四大组件之一的BroadcastReceiver,在Android里面的广播机制是通过BroadcastReceiver来实现的,要需要Android的开发,广播机制是必不可少的内容。

  • 马上学Android 026 - Android BroadcastReceiver的使用教程01

广播主要是方便应用程序在系统级上进行消息的传递,而非在应用程序本身之间进行。每个应用程序可以对感兴趣的内容进行广播的注册,这样程序就能接收到感兴趣的内容了,学习Android广播需要涉及下面的内容:

####Broadcast Receiver 顾名思义“广播接收器” — 可以接收来自系统和应用的广播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. 如何创建Broadcast Receiver
a.新建一个继承BroadcastReceiver的类
b.重写onReceive()方法
c.注册广播

2.BroadcastReceiver的生命周期
调用广播执行完onReceive()就结束。
注意!!!如果在onReceive()执行时间过长(10s),系统会报出应用未响应(ANR)错误!解决方案

3.注册广播方法
a.静态注册:AndroidManifest.xml
b.动态注册:Java代码注册

4.广播类型
a.普通广播:所有监听某个广播的接收者,都能收到广播
b.有序广播:按接收者优先顺序接收,优先级在intent-filter中priority属性设置(-1000 ~ 1000)

如果把上面四部分内容掌握了,大部分关于广播的内容就都掌握了。


创建广播的方法很简单和创建其他Android组件类似,创建一个继承自BroadcastReceiver的类,然后重新onReceive()方法即可,模板如下:

1
2
3
4
5
6
7
public class MyBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
//接收到广播后执行的逻辑代码
}
}

当然有了自定义的广播接收器之后,还是无法接收到系统或者应用程序发出的广播,为什么呢?因为你还没有告诉Android系统,你定义了一个广播接收器,创建广播的第二步就是要注册广播,注册方式用两种,下面看一下静态注册的方法,在AndroidManifest.xml里面进行组成:

1
2
3
4
5
<receiver android:name="com.chen.broadcast.MyBroadcastReceiver" >
<intent-filter android:priority="1000" >
<action android:name="com.chen.action.NOTIFY" />
</intent-filter>
</receiver>

在receiver节点的属性至少要给出name属性,另外在intent-filter节点下要给出action的名称,这样就完成了一个广播接收器的注册,那么注册完了广播接收器就会进行监听,如果捕获到广播那么就是执行onReceiver方法:

在应用程序中定义一个按钮,并实现发送广播的逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class SendBroadcastActivity extends Activity {

private Button btnSendBroadcast;
private EditText etSendBroadcast;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_broadcast);

etSendBroadcast = (EditText) findViewById(R.id.etSendBroadcast);
btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcast);

btnSendBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//如何发送广播?
String strMsg = etSendBroadcast.getText().toString();
Intent broadcastIntent = new Intent();
//设置intent的action,注意此处的action要和AndroidManif.xml的receiver的action要一致否则无法捕获
broadcastIntent.setAction("com.chen.action.NOTIFY");
broadcastIntent.putExtra("msg",strMsg);
sendBroadcast(broadcastIntent);
}
});
}
}

当广播发送出去后,并且正确的捕获广播后,可以onReceiver进行响应,这里简单的用Toast弹出一条消息,另外注意不能在onReceiver中执行一些非常耗时的操作,否则程序会出现ANR!

1
2
3
4
5
6
7
8
9
public class MyBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
//接收到广播后执行的逻辑代码
String strMsg = intent.getExtras.getString("msg");
Toast.makeText(context,"接收到的广播是:"+strMsg,Toast.LENGTH_SHORT);
}
}

经过了三个步骤后就可完成Android的简单广播接收器的机制。