四大组件之BroadcastReceiver

广播的两种方式

标准广播

  • 一种完全异步执行的广播,在广播发出之后,所有的广播接收器都会在同一时刻接收到这条广播消息,他们之间没有先后顺序,这样的效率比较高,但同时也是无法被截断的。
    四大组件之BroadcastReceiver_第1张图片

有序广播

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

接收系统广播

动态注册广播

  • 在代码中注册广播就叫做动态注册广播
  • 监听手机网络状态的广播接收器,代码如下:
public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //广播的值
        intentFilter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver=new NetworkChangeReceiver();
        //注册广播,表示NetworkChangeReceiver只会接收值为android.net.conn.CONNECTIVITY_CHANGE的广播
        registerReceiver(networkChangeReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态广播务必要记得取消注册才行
        unregisterReceiver(networkChangeReceiver);
    }

    //定义一个内部类,使其继承BroadcastReceiver,复写其中的onReceive方法
    class NetworkChangeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //获取系统服务类中专门用于管理网络连接的对象,
            ConnectivityManager connectivityManager= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            //再得到NetworkInfo,用其判断当前的网络状态
            NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
            if (networkInfo!=null&&networkInfo.isAvailable()){
                Toast.makeText(MainActivity.this, "可用", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(MainActivity.this, "不可用", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

监听手机网络的状态需要在Manifest文件中添加权限android.permission.ACCESS_NETWORK_STATE

  • 效果图如下:
    四大组件之BroadcastReceiver_第2张图片

静态注册广播

  • 静态注册广播就是在AndroidManifest文件中进行注册广播
  • 静态注册实现开机启动
  • 只需要自己在写一个新的类继承自BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "开机自启动", Toast.LENGTH_SHORT).show();
    }
}
  • 然后在Manifest文件中进行权限的授予和广播接收器的注册即可。
        //权限的授予
         <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
        //广播的注册
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED">
                </action>
            </intent-filter>
        </receiver>
  • 效果如图所示:
    四大组件之BroadcastReceiver_第3张图片

动态注册和静态注册的区别

  • 动态注册的广播接收器可以自由的控制广播的注册与注销,在灵活性方面有很大的优势,缺点就是只能在程序启动之后才能接收广播,相反,静态注册的广播就可以解决这个问题。

你可能感兴趣的:(四大组件之BroadcastReceiver)