Android_BroadcastReceiver(一)

来源:互联网 发布:mac彻底卸载office 编辑:程序博客网 时间:2024/06/06 06:31

Android_BroadcastReceiver

作为一个Android小白,这是我的第一篇CSDN博客,这篇博客的主要内容介绍的是Android中的四大组件之一:广播

(BroadcastReceive),这些只是我的理解,如有差错,留言或者androidchw@163.com联系,谢谢。
Android中的广播主要分为两种形式:

标准广播(Normal Broadcasts)
一种异步执行的广播,所有的广播接收器几乎都在同一时刻接收到这条广播消息。它们之间没有任何顺序可言。这种广播的优点是效率比较高,但是这种广播无法拦截。并且在程序启动之后才能接收广播。
有序广播(Ordered Broadcastss)
一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播能接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传播。此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播,并且前面的广播可以拦截广播。

上面说的可能太书本话了,下面就让我举个例子帮助大家更好的理解标准广播和有序广播。    

标准广播
相信在帝都工作的程序猿都遇见过这种情况,公交车来了以后,人们都争先恐后的去公交车门那里挤公交。这就相当于系统发出一条广播,手机中的App争先恐后的抢这个广播。就像人们争先恐后的挤公交车一样,完全没有顺序可言。
标准广播
有序广播
相信大家上学的时候,都遇见过大扫除这个事情吧。老师先把大扫除的消息给卫生委员分布下去,卫生委员又把大扫除的消息分布给各个组长,组长又把大扫除的消息分布个各个组员。有序广播就是这样传播的。它是有先后顺序的,级别越高的获取广播也就越早,并且还能够拦截不让后面级别低的获取到广播。
有序广播
手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或者时区发生改变也会发出一条广播。一个广播的完成需要两个步骤:发送广播和接收广播。现在,我们就从最基础的接收系统广播开始学习吧。
如果你想了解更多有关Android系统的中的广播,可以查看 Android系统广播大全

现在我们就从最简单的接收系统广播开始学习吧,学习之前我们还是先了解一下广播的注册方式,Android中广播的注册方式有两种:(1)动态注册广播:在代码中注册。(2)静态注册广播:在AndroidManifest.xml中注册。

动态注册广播

public class MainActivity extends Activity {    private IntentFilter intentFilter;    private NetworkChangeReceiver networkChangeReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 动态注册广播        intentFilter = new IntentFilter();        //广播接收器想要监听什么样的广播,就在这里添加响应的action就行了。        intentFilter.addAction("android.net.con.CONNECTIVITY_CHANGE");        networkChangeReceiver = new NetworkChangeReceiver();        registerReceiver(networkChangeReceiver, intentFilter);    }    class NetworkChangeReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);            NetworkInfo netWorkInfo = connectivityManager.getActiveNetworkInfo();            if (netWorkInfo != null && netWorkInfo.isAvailable()) {                Toast.makeText(MainActivity.this, "network is available", Toast.LENGTH_SHORT).show();            } else {                Toast.makeText(MainActivity.this, "network is not_available", Toast.LENGTH_SHORT).show();            }        }    }    // 这一步至关重要    @Override    protected void onDestroy() {        super.onDestroy();        //取消注册的广播        unregisterReceiver(networkChangeReceiver);    }}

接收系统网络变化的广播还需要权限,所以我们在AndroidManifest.xml中添加一个权限。

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

静态注册广播
以下的代码主要是实现了开机启动的功能。

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

在AndroidManifest.xml中的静态注册广播的代码:

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