android之广播详解上篇

来源:互联网 发布:淘宝紧凑式构图 编辑:程序博客网 时间:2024/05/16 07:31

一.广播概述:

发送广播使用Intent。而接收广播的方法则需要广播接收器(Broadcast Receiver)。
Android 中的广播主要可以分为两种类型,标准广播和有序广播。
标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的
广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可
言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。

有序广播:是一个一个接收的 不是在同一时刻 是有顺序的 因此 这种广播是可以被截断的.

注册广播的方式一般有两种,在代
码中注册和在AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态
注册。

二.接收广播实例

那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver,
并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,
具体的逻辑就可以在这个方法中处理。

动态注册:

public class IndexActivity extends Activity {    private IntentFilter intentFilter;    private NetworkChangeReceiver networkChangeReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        intentFilter = new IntentFilter();        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        networkChangeReceiver = new NetworkChangeReceiver();        registerReceiver(networkChangeReceiver, intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(networkChangeReceiver);//动态注册广播 在destory方法 一定要取消注册    }    class NetworkChangeReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            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();            }        }    }
另外,这里有非常重要的一点需要说明,Android 系统为了保证应用程序的安全性做了
规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则
程序将会直接崩溃, 比如这里查询系统的网络状态就是需要声明权限的。

查询网络权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

静态注册:

动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是
它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在
onCreate()方法中的。

public class BootCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();}}

可以看到,这里不再使用内部类的方式来定义广播接收器,因为稍后我们需要在
AndroidManifest.xml 中将这个广播接收器的类名注册进去

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

由于Android 系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED 的广
播,因此我们在这里添加了相应的action。
另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用<uses-permission>
标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED 权限。



0 0