在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的。Android提供了一整套完整的API,允许应用程序自由地发送和接收广播。发送广播就是借助之前了解过的Intent,接收广播则需要用到广播接收器(Broadcast Receiver)。.
1、广播的类型
2、广播接收器的使用方法
Android系统内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。例如,手机开机完成后会发出一条广播消息,电池的电量发生变化时会发出一条广播,时间或时区发生改变时也会发出一条广播等等;我们如果想要接收到这些广播,则需要用到广播接收器。
创建广播接收器的方法很简单,我们只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑可以在这个方法中进行处理。
3、广播接收器的注册
广播接收器可以自由地对自己感兴趣的广播进行注册,这样才能在有相应的广播发出时,广播接收器就能够收到该广播,并在内部进行相应的逻辑处理。注册广播的方式有两种:
1 public class ThirdActivity extends Activity {
2
3 private IntentFilter intentFilter ;
4 private NetworkChangeReceiver networkChangeReceiver ;
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_third);
10
11 intentFilter = new IntentFilter() ;
12 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
13 networkChangeReceiver = new NetworkChangeReceiver() ;
14 registerReceiver(networkChangeReceiver, intentFilter) ;
15
16 unregisterReceiver(networkChangeReceiver);
17 }
18
19 class NetworkChangeReceiver extends BroadcastReceiver{
20 @Override
21 public void onReceive(Context context, Intent intent) {
22 Toast.makeText(context, "network changed", Toast.LENGTH_SHORT).show();
23 }
24 }
25 }
优缺点:动态注册的广播接收器可以自由地控制注册和注销,非常灵活,但是也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在Activity的onCreate()方法中的。
<receiver android:name=".BootCompleteReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED />
</intent-filter>
</receiver>
静态注册的优点在于可以一开机就可以开始接收相应的广播,不会像动态注册那样必须要等到启动程序后才可以。
4、发送自定义广播
广播是一种可以跨进程的通信方式,我们可以在我们的应用程序中发送广播,其他应用进程也可以收到我们的广播信息。发送广播是通过Intent来实现的。
1 button.setOnClickListener(new OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 Intent intent = new Intent("com.keli.MY_BROADCAST") ;
5 sendBroadcast(intent);
6 }
7 });
当然,我们也可以在发送广播的Intent中携带一些数据。然后在广播接收器的onReceive()方法中通过getIntent()方法来获取Intent,并取出相应的数据。
1 <receiver android:name=".MyBroascastReceiver">
2 <intent-filter android:priority="100">
3 <action android:name="com.keli.MY_BROADCAST"/>
4 </intent-filter>
5 </receiver>
此外,对于有序广播,我们可以在我们的广播接收器中的onReceive()方法的逻辑中对该广播进行截断,截断广播的方法也很简单,直接调用abortBroadcast();方法就可以了。
5、在广播接收器中启动活动
在广播接收器中也可以启动一个活动,但是我们启动活动之前必须给intent加入FLAG_ACTIVITY_NEW_TASK标志,否则将无法启动。下面的代码是创建一个广播接收器,在接收到广播后弹出一个警告对话框,并且设置该对话框不可取消,只能通过点击确定按钮来启动另一个活动页面。
1 public class NetworkChangeReceiver extends BroadcastReceiver{
2 @Override
3 public void onReceive(final Context context, Intent intent) {
4 //构建对话框,并设置对话框的标题、内容
5 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context) ;
6 dialogBuilder.setTitle("Warning") ;
7 dialogBuilder.setMessage("You are forced to ofline. Please try to login again") ;
8 //设置对话框不可取消
9 dialogBuilder.setCancelable(false) ;
10 //设置对话框的确定按钮,第一个参数是按钮上显示的text,
11 //第二个参数是添加点击确定按钮的响应事件,这里我们设定为启动一个登陆界面
11 dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
12 @Override
13 public void onClick(DialogInterface dialog, int which) {
14 Intent intent = new Intent(context, LoginActivity.class) ;
15 //必须添加FLAG_ACTIVITY_NEW_TASK标志
16 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;
17 context.startActivity(intent);
18 }
19 });
20 AlertDialog alertDialog = dialogBuilder.create() ;
21 //设置AlertDialog的类型,保证在广播接收器中可以正常弹出
22 alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
23 }
24 }