广播机制

作者: wxyass 分类: Android 发布时间: 2017-03-29 16:50

广播机制

标准广播,有序广播

标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的.

有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了

动态注册广播: 监听网络变化

1 新建项目,修改 MainActivity 中的代码

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;

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 的实例
        intentFilter = new IntentFilter();
        // 添加了一个值为 android.net.conn.CONNECTIVITY_CHANGE 的 action
        // 因为当网络状态发生变化时,
        // 系统发出的正是一条值为 android.net.conn.CONNECTIVITY_CHANGE 的广播,
        // 也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action 就行了。
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        // 创建了一个 NetworkChangeReceiver 的实例
        networkChangeReceiver = new NetworkChangeReceiver();
        // 注册
        registerReceiver(networkChangeReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消注册
        unregisterReceiver(networkChangeReceiver);
    }

    /**
     * 定义了一个内部类, 继承 BroadcastReceiver ,并重写了父类的 onReceive()方法
     */
    class NetworkChangeReceiver extends BroadcastReceiver {

        // 每当网络状态发生变化时,onReceive()方法就会得到执行
        @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, "此时网络正常", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "此时无网络", Toast.LENGTH_SHORT).show();
            }
        }
    }
}      

1 在AndroidManifest.xml 文件中,配置网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3 运行程序,按home键返回桌面,断开网络,查看效果

静态注册广播: 实现开机启动

动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了.

1 新建一个 BootCompleteReceiver 继承自BroadcastReceiver

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * 手机启动的广播注册
 */
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "手机启动的广播", 0).show();
    }
}    

2 修改 AndroidManifest.xml 文件,添加权限

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

3 修改 AndroidManifest.xml 文件,添加广播注册

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

4 运行程序后,重启手机,查看效果

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注