先做记录:未完!待更新!

//备忘:下载安卓源代码

广播机制,先说一下广播分为:标准广播,和有序广播。

标准广播是一种完全异步的广播,在广播发出后,所有的广播接收器几乎会在同一时间,同时接收到广播,效率高但是无法截断。

有序广播是同步执行的操作。在每一个时刻只有一个广播接收器可以接受到这条广播,所有的广播接收器按照设置好的优先级进行接收,高优先级的广播接收器,可以将广播截断。

Android 内置了许多系统广播,现在我们先来说一下系统广播:

系统广播按照注册方式可分为,动态广播和静态广播。动态广播就是在代码中注册的广播,只有在App运行时才可以接收到的广播;静态广播就是在APP不运行时也可以收到的广播,但是这并不意味着,我们可以利用静态广播去启动APP,因为谷歌在android8.0之后对广播做了完全的限制。砍掉了大部分静态广播,导致现在大部分广播都是动态注册才可以接收到的。

下面以网络变化为例介绍一下动态广播(先上代码):

这里涉及到的代码有两个部分第一部分是在Activity中:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private IntentFilter intentFilter;
    private MyBroadCastReceiver myBroadCastReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //我觉得IntentFilter我管他叫做意图筛选器
        //意思是从众多的action 中筛选中自己需要的
        intentFilter=new IntentFilter();
        //android.net.conn.CONNECTIVITY_CHANGE,这个action就是网络发生变化时,系统会发出的广播
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //实例化一个广播接收器
        myBroadCastReceiver=new MyBroadCastReceiver();
        //注册网络接收器
        registerReceiver(myBroadCastReceiver,intentFilter);
    }
    //先定义一个内部类继承自BroadcastReceiver,这样当网络发生变化是 这个广播接收器就会接收到广播。
    //onReceive()中的代码就会得到执行
    class MyBroadCastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(TAG, "onReceive: 网络出现变化");
            try{
                //ConnectivityManager 是一个专门管理网络连接的系统服务类,这里是通过getSystemService获得一个ConnectivityManager的实例
                ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
                //ConnectivityManager通过调用getActiveNetworkInfo()就可以获取到NetWorkInfo的实例
                //接下来就可以知道网络是否可用
                NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
                if (networkInfo!=null&&networkInfo.isAvailable()){
                    Log.i(TAG, "onReceive: 网络是可用的");
                }else {
                    Log.i(TAG, "onReceive: 网络不可用");
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消网络接收器的注册
        //必须要取消注册,否则会导致内存泄漏
        unregisterReceiver(myBroadCastReceiver);
    }
}

第二部分代码是在AndroidManifest.xml文件(清单)中申请权限:

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

这是实现的效果图:

 

接下来是静态广播,静态广播在现在的环境下,不好做展示,我讲一下代码吧。