Android基础之广播

一、类型

  1. 标准广播

    完全异步执行的广播,所有广播接收器几乎都会同时接收到这条广播消息

  2. 有序广播

    同步执行的广播,广播接收器有先后顺序

二、接收系统广播

  1. 如何创建一个广播接收器?

    新建一个类,让他继承自BroadcastReceiver,并且重写父类的onReceive()方法

  2. 动态注册(在代码中注册—推荐)

    MainActivity.java

    package com.example.lenovo.broadcasttest;
    
    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.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        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.conn.CONNECTIVITY_CHANGE");
            networkChangeReceiver=new NetworkChangeReceiver();
            //调用registerReceiver()进行注册,让NetworkChangeReceiver收到android.net.conn.CONNECTIVITY_CHANGE的广播
            registerReceiver(networkChangeReceiver,intentFilter);
        }
        @Override
        protected void onDestroy(){
            super.onDestroy();
            unregisterReceiver(networkChangeReceiver);
        }
        //广播接收器
        class NetworkChangeReceiver extends BroadcastReceiver{
            @Override
            public void onReceive(Context context, Intent intent){
                //通过getSystemService()得到ConnectivityManager的实例,这是一个系统类,专门用于管理网络连接
                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();
                }
            }
        }
    }
    

    在AndroidManifest.xml中注册权限(不注册会导致崩溃)

        <!-- 申请查看网络状态的权限 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    效果图:
    Android基础之广播

Android基础之广播
3. 静态注册(在AndroidManifest.xml注册—不推荐)

  1. 优点:

    在程序未启动的情况下就能接收广播

  • 问题原因:
    Android8.0在AndroidManifest.xml文件中静态注册广播接收失效是由于官方对耗电量的优化,避免APP滥用广播的一种处理方式。除了少部分的广播仍支持静态注册(如开机广播),其余的都会出现失效的情况。

  • 解决方案:

    尽量使用动态注册