您的位置:首页 > 其它

广播机制小结

2015-05-08 20:02 225 查看
Android 中的应用程序都可以对自己感兴趣的广播进行注册,这样该程序就可接收所关心的广播内容。而这些广播可来自系统,也可来自其他应用程序。

PS: 感觉类似观察者模式。

Android 内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。

1. 广播类型

1.1 标准广播

标准广播(Normal broadcast),是一种完全异步执行的广播。

特点:

1. 广播发出后,所有广播***几乎会在同一时刻接收到这条广播。

2. 效率比较高。

3. 无法被截断。

1.2 有序广播

有序广播(Ordered broadcast),是一种同步执行的广播。

广播发出之后,同一时刻只有一个广播***能收到这条广播消息。这个广播***中的逻辑执行完毕后,广播才继续传递。

注意:此时的广播***是有先后顺序的,优先级高的广播***就可以先收到广播消息。且前面的广播***还可截断正在传递的广播。

截断广播:abortBroadcast()

2. 注册广播

注册广播一般有两种方式:动态注册和静态注册。

2.1 动态注册

即在代码中注册。

示例代码:

[code]private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;

//新建过滤器,添加发送的广播
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); //效果同上2句

//新建***,接收广播
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter); //参数:***名字,过滤器名字

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(networkChangeReceiver); //动态注册的广播***一定都要取消注册,一般在onDestroy方法中取消
}

class NetworkChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            /* getSystemService()方法:获得ConnectivityManager的实例(这是一个系统服务类,专门用于管理网络连接)
             * getActiveNetworkInfo()方法:获得 NetworkInfo 的实例
             * NetworkInfo 的 isAvailable()方法:判断出当前是否有网络
             */                          
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();

            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
            }
        }       
    }

//此外,也可通过点击按钮发送广播,例如:
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

//若为有序广播,则为:
sendOrderedBroadcast(intent, null);


优点:灵活度高。

缺点:必须在程序启动后才能接收广播。

2.2 静态注册

在配置文件(AndroidManifest.xml)中注册。

示例代码:

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

<!-- 
注:receiver在application标签内,与activity同级别,用法和<activity>标签类似。
android:priority 为广播***优先级,用于有序广播。
    1. 通过 android:name来指定广播***
    2. 在<intent-filter>标签里加入想要接收的广播
 -->


优点:程序未启动就能接收到广播。

缺点:不够灵活。

配置权限:

Android 系统为了保证应用程序的安全性做了规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则程序将会直接崩溃。比如这里查询系统的网络状态就是需要声明权限的 。

AndroidManifest.xml 中权限配置示例代码:

[code]<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- 与application同级别 -->


3. 自定义广播

3.1 新建广播***

如何新建广播***:

新建一个内部类,让它继承自 BroadcastReceiver,并重写父类的 onReceive()方法。

当有广播到来时, onReceive()方法就会得到执行,具体的逻辑就可在此方法中处理。

代码示例:

[code]public class MyBroadcastReceiver extends BroadcastReceiver


3.2 注册广播***

即在 AndroidManifest.xml 中注册这个广播***。

示例代码:

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


3.3 修改 activity_main.xml

添加部件,如按钮(非必须)。

3.4 修改 MainActivity

添加实现逻辑,例如添加按钮动作。

注意:

1. Broadcast 生命周期只有10秒左右,因此不能做比较耗时的操作。应通过Intent发给Service,由Service完成。

2. 广播***更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。不能使用子线程。

4. 本地广播

目的:简单解决广播安全性问题。

优点

1. 发出和接收广播只能在应用程序内部传递。

2. 可避开其他程序的广播,因此无需担心安全漏洞隐患。

3. 比系统全局广播更高效。

注意:本地广播无法通过静态注册来接收。

注:初学Android,主要内容来自郭霖的《第一行代码》,稍加自己总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: