网站开发有什么职位,农家乐网站源代码,wordpress 访问速度,专业网站建设要多少钱目录
一#xff0c;Broadcast和BroadcastReceiver
1#xff0c;简介
2#xff0c;广播使用
二#xff0c;静态注册和动态注册
三#xff0c;无序广播和有序广播
1#xff0c;有序广播的使用
2#xff0c;有序广播的截断
3#xff0c;有序广播的信息传递
四Broadcast和BroadcastReceiver
1简介
2广播使用
二静态注册和动态注册
三无序广播和有序广播
1有序广播的使用
2有序广播的截断
3有序广播的信息传递
四本地广播与全局广播
1本地广播的使用 一Broadcast和BroadcastReceiver
1简介 broadcast是Android提供的一种广播机制用于组件或进程即应用间通信同时也是Android四大组件之一 广播broadcast由两部分组成发送者和接收者。发送者可以是ActivityService等广播的接收者为BroadcastReceiver也就是广播接收器
2广播使用
broadcast的使用基本分为四步
创建BroadcastReceiver类注册BroadcastReceiver发送广播解除注册
1创建BroadcastReceiver子类重写onReceive方法。onReceive方法接收两个参数context和intentcontext为发送者的上下文intent是发送者发送过来的信息
public class MyBroadcastReceiver extends BroadcastReceiver {private static final String TAG MyBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, MyBroadcastReceiver onReceive: 收到了广播消息);}
}
2注册接收器接收器的注册方式分为静态注册和动态注册两种方式这里使用动态注册方式。注册时需要配置过滤器并且设置action这里的action表示该注册器能够接收到包含该action的广播
private void registerTheReceiver() {//配置过滤器设置actionIntentFilter intentFilter new IntentFilter();intentFilter.addAction(TextUtil.ACTION_SEND_RESULT);//注册接收器registerReceiver(broadcastReceiver, intentFilter);
}
3发送广播与其他四大组件ActivityService相同也是通过intent来发送广播通过设置action标识该广播可被哪些接收器接收到通过putExtra来传递额外信息
//设置信息
Intent intent new Intent();
intent.setAction(TextUtil.ACTION_SEND_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, 这是广播1);
//发送广播
sendBroadcast(intent);
4解除注册应当在合适的地方解除接收器的注册
Override
protected void onDestroy() {super.onDestroy();Log.i(TAG, onDestroy: );//解除注册unregisterReceiver(broadcastReceiver);
}
二静态注册和动态注册 广播接收器有两种注册方式在Manifest文件中注册和在java代码中注册我们称在Manifest文件中注册为静态注册在java代码中注册为动态注册。 上面使用的方式即为动态注册下面为静态注册方式
1静态注册前同样需要先创建接收器类然后在Manifest文件中指明接收器的类名可以通过intent-filter标签来配置过滤器并设置action 静态注册的广播一般用于在应用启动时自动接收待定事件比如系统启动网络状态变化和电池状态变化等
常见的广播类型Action 三无序广播和有序广播
无序广播接收器接收到的广播没有先后顺序几乎同时收到
有序广播接收器按优先级顺序接收广播同一时刻只能有一个接收器接收到广播
简单来说就是广播可以设置优先级然后就可以按顺序接收到广播设置了优先级的广播称为有序广播没有设置的称为无序广播普通广播为无序广播
1有序广播的使用 通过IntentFilter过滤器的setPriority方法设置优先级数值范围一般在-1000~1000之间数值越大优先级越高有序广播通过sendOrderedBroadcast方法发送
注册三个接收器依次设置优先级那么接收到的顺序应为3 2 1
private void registerMyReceiver() {IntentFilter intentFilter new IntentFilter(TextUtil.ACTION_SEND_RESULT);IntentFilter intentFilter2 new IntentFilter(TextUtil.ACTION_SEND_RESULT);IntentFilter intentFilter3 new IntentFilter(TextUtil.ACTION_SEND_RESULT);//设置优先级intentFilter.setPriority(100);intentFilter2.setPriority(101);intentFilter3.setPriority(102);registerReceiver(myBroadcastReceiver, intentFilter);registerReceiver(myBroadcastReceiver2, intentFilter2);registerReceiver(myBroadcastReceiver3, intentFilter3);
}
Intent intent new Intent();
intent.setAction(TextUtil.ACTION_SEND_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, 这是广播2);
//有序广播的发送
sendOrderedBroadcast(intent, null);
运行结果如下可以看到接收顺序确实为3 2 1 2有序广播的截断 在接收器中调用abortBroadcast方法即可阻断有序广播的传递 截断后广播不在向下传递类似于Android的事件分发 以上面的例子为基础我们在接收器2中截断广播那么预期结果应为接收器3 2可以接收到广播1接收不到
public class MyBroadcastReceiver2 extends BroadcastReceiver {private static final String TAG MyBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, MyBroadcastReceiver2 onReceive: 收到广播消息);abortBroadcast(); //有序广播的截断}
}
运行结果如下可以看到接收器1没有接收到广播 3有序广播的信息传递 在有序广播的传递过程中可以通过一系列方法来传递一些信息上游接收器通过这些方法来向下游传递额外信息
//传递Bundle信息setResultExtras(Bundle);//传递字符串信息
setResultData(String);//传递int型信息
setResultCode(int);//同时传递int String Bundle型数据
setResult(int, String, Bundle);
下游接收器通过对应的get方法来获取信息
//获取Bundle信息
getResultExtras(true);//true表示如果传递过来的数据为空则返回一个空的Map//获取int型信息
getResultCode();//获取String型信息
getResultData(); 例如我们在接收器3中向下游传递一些信息因为接收器2的优先级小于接收器3所以可以在接收器2中接收到传递的信息
public class MyBroadcastReceiver3 extends BroadcastReceiver {private static final String TAG MyBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {//向下游传递额外信息Bundle bundle intent.getExtras();bundle.putString(name, MyBroadcastReceiver3 喜多郁代);setResultExtras(bundle);Log.i(TAG, MyBroadcastReceiver3 onReceive: 收到静态广播消息);}
}public class MyBroadcastReceiver2 extends BroadcastReceiver {private static final String TAG MyBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle getResultExtras(true);//true表示如果传递过来的数据为空则返回一个空的MapString name bundle.getString(name);Log.i(TAG, 发件人: name 收件人: MyBroadcastReceiver2);Log.i(TAG, MyBroadcastReceiver2 onReceive: 收到静态广播消息);}
}
运行结果如下 四本地广播与全局广播
本地广播仅在本app内部传播其他app接收不到保证了数据的安全性
全局广播可以在整个手机所有app之间传播会有安全性问题普通广播默认是全局广播
本地广播的注册发送和解除注册都需要通过LocalBroadcastManager类来完成使用LocalBroadcastManager需要添加依赖 implementation androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 另外本地广播只能使用动态注册的方式因为静态注册一般用于在应用启动时自动接收待定事件而这些广播一定是全局广播
1本地广播的使用
1创建接收器还是常规操作
public class MyLocalBroadcastReceiver extends BroadcastReceiver {private static final String TAG MyLocalBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, onReceive: 收到了本地广播);}
}
2通过LocalBroadcastManager类注册接收器
//获取localBroadcastManager类
localBroadcastManager LocalBroadcastManager.getInstance(this);IntentFilter intentFilter1 new IntentFilter(TextUtil.ACTION_SEND_LOACL_RESULT);localBroadcastManager.registerReceiver(myLocalBroadcastReceiver, intentFilter1);
3发送广播
Intent intent new Intent();
intent.setAction(TextUtil.ACTION_SEND_LOACL_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, 这是本地广播);
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
4解除注册
Override
protected void onDestroy() {super.onDestroy();localBroadcastManager.unregisterReceiver(myLocalBroadcastReceiver);
}