Android系列之广播

来源:互联网 发布:2017最新网络词汇 编辑:程序博客网 时间:2024/05/18 02:17

  为了进行系统级别的消息通知,Android引入了广播的概念。并且Android中的广播更加灵活,因为应用程序可以自己发布广播与接收广播。发送广播就需要借助Intent来发送,而接收广播则需要利用BroadcastReceiver类,通过重载onReceive方法来进行接收广播操作。
广播接收:
  首先,接收系统广播。如何接收系统广播呢,在这有2种方式,动态和静态。
  动态接收,则新建一个类继承自BroadcastReceiver并实现onReceive方法,但是,这个接收广播子类怎么知道要接收哪一个广播呢?那么就需要通过IntentFilter类添加相应的动作,然后通过Activity的registerBroadcast方法传入接收广播子类与IntentFilter对象将接收广播的动作注册到应用中。由此实现了接收广播的操作,那么接收的是何种广播则是由IntentFilter添加的动作决定。当然,如果要调用系统的功能,则需要在AndroidManifest文件中添加相应的权限。
示例代码如下:

IntentFilter = new IntentFilter();IntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");NetworkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver, intentFilter);

其中,NetworkChangeReceiver是一个继承自BroadcastReceiver的广播接收器。并且在Activity的onDestroy()方法中注销该广播接收器:

@Overrideprotected void onDestroy() {    super.onDestroy();    unregisterReceiver(networkChangeReceiver);}

由此,完成广播接收器的动态注册。
  那么何为静态接收呢?动态的接收都是需要应用程序打开后才能接收,但若我需要监听一些广播但不需要程序启动的话怎么办呢?例如监听系统开机广播,这时候就需要静态接收广播了。静态接收同样是需要新建一个子类继承BroadcastReceiver并实现onReceive方法。唯一不同的是动态的广播注册需要在代码中完成,而静态的注册则是在AndroidManifest文件中完成。在此文件中添加receiver标签(所有广播的接收都在这),通过指定接收器的名字以及Intent-Filter标签的动作来完成广播接收。
在AndroidManifest文件的application标签内添加receiver标签,来注明广播接收器。该部分代码如下:

<receiver android:name=".BootCompleteReceiver" >    <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED" />    </intent-filter></receiver>

其中的“.”代表当前路径,即包名。
/**
要注意的是,当自定义的广播接收器是内部类时,使用静态注册方式中,广播接收器的注册有点不同。主要有2点要注意:
①、该广播接收器需为静态内部类广播接收器。其中静态的很关键。
②、在注册时,android:name=”“;的值应为.外部类$内部类广播接收器,通过“$”来指定内部类广播接收器。
*/
广播发布:
  以上描述了广播的接收,那么我们自己可不可以建立一条广播来发送呢?答案是肯定的。上面讲了发送广播是需要利用Intent。通过在Intent中传入广播类型参数,然后调用sendBroadcast方法将广播发送出去,就完成了广播的发送。当然,广播的发送也有不同的模式,Android里就有2种广播模式:标准和有序。标准方式就如上所述,只要有监听该广播的接收器都会同时接收到该广播。
部分代码如下:
在定义完自己的广播接收器后,在AndroidManifest文件中进行注册。

<receiver android:name=".MyBroadcastReceiver">    <intent-filter>        <action android:name="com.example.broadcasttest. MY_BROADCAST"/>    </intent-filter></receiver>

可以看到,其中的action有所不同,这个action是我们自定义的action。即当有带有这种action的广播发布时,我们自定义的广播接收器就会接收到。那么只需要在发布广播的时候将这个action包含进去就行了。发送广播我们也是通过Intent进行意图发布。部分代码如下:

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent);

这里,我们定义了一个Intent并在其中添加了相应的action。然后调用Activity的sendBroadcast方法将带有这个意图的广播发送出去。
  有序的广播就有了先后次序。有序的发送广播也很简单,与标准的发送方式稍有不同。首先需要将sendBroadcast方法换成sendOrderedBroadcast方法。不过此方法有2个参数,第一个仍是Intent对象,第二个则是与权限相关的字符串(这里暂时用不到,所以设为null)。最后只需给想要优先接收到的广播接收器,设置较高的优先级即可。部分代码如下:

<receiver android:name=".MyBroadcastReceiver">    <intent-filter android:priority="100" >        <action android:name="com.example.broadcasttest.MY_BROADCAST"/>    </intent-filter></receiver>

其中,优先级作为IntentFilter的一个属性。
  那么有的时候我们希望我们发送的广播与接收的广播都只在程序内部进行,外部与本程序的广播一点关系都没,那么怎么办呢?这就需要使用本地广播了。通过LocalBroadcastManager类,调用对应的sendBroadcast和registerBroadcast方法来发送与接收广播。(通过LocalBroadcastManager.getInstance方法来获得LocalBroadcastManager实例)。示例代码如下:
  

localBroadcastManager = LocalBroadcastManager.getInstance(this);Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");localBroadcastManager.sendBroadcast(intent); // 发送本地广播intentFilter = new IntentFilter();intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");localReceiver = new LocalReceiver();localBroadcastManager.registerReceiver(localReceiver, intentFilter);//并在onDestroy方法中进行接收器的注销。@Overrideprotected void onDestroy() {    super.onDestroy();    localBroadcastManager.unregisterReceiver(localReceiver);}

  至此,所有关于广播的内容都描述完毕。

1 0
原创粉丝点击