先做记录:未完!待更新!
//备忘:下载安卓源代码
广播机制,先说一下广播分为:标准广播,和有序广播。
标准广播是一种完全异步的广播,在广播发出后,所有的广播接收器几乎会在同一时间,同时接收到广播,效率高但是无法截断。
有序广播是同步执行的操作。在每一个时刻只有一个广播接收器可以接受到这条广播,所有的广播接收器按照设置好的优先级进行接收,高优先级的广播接收器,可以将广播截断。
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"/>
这是实现的效果图:
接下来是静态广播,静态广播在现在的环境下,不好做展示,我讲一下代码吧。