初识安卓的另一个重要的组件---广播。
1、广播的分类
-
标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播 接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
-
有序广播:是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
2、广播的注册方式
1、动态注册
动态注册是在app运行时注册。在需要注册的地方写以下代码(监听网络状态为例):
/** * 下面是广播的代码 */ ? // intentFilter = new IntentFilter(); // intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // myInternetReceiver = new MyInternetReceiver(); // registerReceiver(myInternetReceiver,intentFilter);
?
并定义一个内部类,继承Androidx的BroadcastReceiver。
// //自定义的广播 // class MyInternetReceiver extends BroadcastReceiver{ // @Override // public void onReceive(Context context, Intent intent) { // Toast.makeText(context,"internet change",Toast.LENGTH_SHORT).show(); // ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); // if (activeNetworkInfo != null && activeNetworkInfo.isAvailable()){ // Toast.makeText(context,"现在有网",Toast.LENGTH_SHORT).show(); // }else { // Toast.makeText(context,"没网了",Toast.LENGTH_SHORT).show(); // } // } // }
这样就可以动态注册。
2、静态注册
为了方便可以直接new一个自定义的类:new--other---Broadcast Receiver
新建后AS便帮助我们在AndroidManifest.xml中注册了该广播接收器。
因为此处是用开机自启动作示范,所以在该广播接收器内加入要接受的广播类型即开机
所以还需要添加一个权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
至此静态注册已经完成,重启模拟器后便可以接收到广播。
因为是按照《第一行代码》所学习的,那时Android版本还比较低,在后来谷歌更改了静态注册的规则,像这种开启自启动的(流氓)广播已经被禁止了。但是有一些豁免名单里的内容可以静态注册。
3、自定义广播
1、标准广播
做法与静态广播相同,不过不同的是监听的广播是自己自定义的。要新建一个继承BroadcastReceiver的类
然后在需要发送广播的地方插入逻辑代码:
Intent intent = new Intent("com.example.firstdemo.MY_BROADCAST"); Log.i("mytag", "onClick: "+getPackageName()); intent.setComponent(new ComponentName(getPackageName(),"com.example.firstdemo.MyBroadcastReceiver")); sendBroadcast(intent);