Intent广播事件

Posted by Young Ken on 2016-03-17

使用Intent广播事件

作为一个系统级别的消息传递机制,Intent可以在晋城之间发送结构化的消息。因此可以通过实现Broadcast Receiver来监听和响应应用程序的Broadcast Intent。

  1. 使用Intent来广播事件
    在应用程序组件中,可以构建希望广播的Intent,然后使用sendBroadcast()发送它。

    1
    2
    3
    Intent intent = new Intent("caobugs.com");
    intent.putExtra("name","Young Ken");
    sendBroadcast(intent);

    这样就把广播发出去了。

  2. 使用Broadcast Receiver监听广播事件
    Broadcast Receiver(通常简单的称为接收器)可以监听Broadcast Intent。要使Broadcast Receiver能接受广播,就需要对其进行注册,可以使用代码注册,也可以使用manifest文件中注册。
    这里要对manifest接收器的应用程序特别说明一下,在Intent广播的时候,程序不一定处于被运行状态。当有匹配的Intent被广播出去的时候,它会被自动启动。
    1
    2
    3
    4
    5
    6
    7
    8
    public class MyBroadcastReceiver extends BroadcastReceiver
    {
    @Override
    public void onReceive(Context context, Intent intent)
    {
    //这这里写接收Intent的处理
    }
    }

这个类要继承BroadcastReceiver类,并且重写onReceive(),在onReceive()中处理Intent广播,但是这里要注意,处理时间不能超出5秒,不然会显示Force Close对话框。
注册Broadcast Receiver主要有两种方式
代码注册(动态注册)
动态注册就是带代码进行注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private IntentFilter intentFilter = new IntentFilter("capbugs.com");
private MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
@Override
protected void onResume()
{
super.onResume();
registerReceiver(myBroadcastReceiver, intentFilter);//注册
}
@Override
protected void onPause()
{
super.onPause();
unregisterReceiver(myBroadcastReceiver);//取消注册
}

这里要非常注意,动态注册一定要取消注册,要不然会出错。
manifest注册(静态注册)
静态注册就是在主配置文件中进行注册

1
2
3
4
5
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="caobugs.com"/>
</intent-filter>
</receiver>

这样注册的好处就是不用管理取消注册了,还有一个好处,就是动态注册必须项目启动的时候才能进行注册,要注册开机启动广播,恐怕就无能为力了。

  1. 有序广播
    有很多的用意程序都注册了这广播,大家都能接收到,有没有让A先收到,B后收到这样的功能呢,答案是肯定的。
    1
    2
    3
    Intent intent = new Intent("caobugs.com");
    intent.putExtra("name","Young Ken");
    sendOrderedBroadcast(intent, null);

调用这样的方法发送的就是有序的广播了,sendOrderedBroadcast()的第一个参数是Intent,第二个是与权限有关的东西,给个null。这样只是发了有序的广播,那么谁决定接收的顺序呢。

1
2
3
4
5
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="caobugs.com"/>
</intent-filter>
</receiver>

大家注意priority属性,这个是接收有序广播优先级的属性,值越高优先级越高,也就是越先接收到广播。

  1. 本地广播(Local BroadCast Manager)简介
    Local BroadCast Manager又叫做本地广播,就是自己的应用程序能接受到这个广播,其他的应用程序接受不到,这样就更加高效,也更加安全。