当面试官直接问你该问题时,对咱们考察的是看咱们否了解播送相关的常识

这里咱们有必要了解播送的基本常识和原理,接下来对该问题进行答复解析。

问题正解

  1. 播送是什么?

  • 播送是一种广泛运用的在运用程序之间传输信息的机制,Android 主要是将体系运行时的各种“事情”告诉给其他运用,因而设计了多种播送。播送机制最大的特征便是发送方并不重视接纳方是否接到数据,也不重视接纳方是怎么处理数据的。
  • Android 中的每个运用程序都能够对自己有利的播送进行注册,这样程序就只会接纳到自己所关怀的播送内容,这些播送可能是来自于体系的,也可能是来自于其他运用程序的,前者是体系播送,后者是自定义播送。播送在详细的项目中运用场景并不多,但一旦运用会使得程序变得精简很多。
  • 安卓的播送原理,BroadCastReceiver是对分宣布来的Broadcast 进行过滤承受并呼应的一类组件,归于Android四大组件之一,主要用于接纳体系或许app发送的播送事情。在咱们的项目中常常运用播送接纳者接纳体系告诉,比如开机发动、低电量、外播电话、锁屏、sd挂载等。 假如咱们需求做的是播映器,那么监听到用户锁屏后咱们应该将播映状况的暂停。android的四大组件中心便是为了完成移动、或许讲是嵌入式设备上的架构,它们之间有时候是一种相互依赖的联系, 有时候又是一种补充联系,引进播送机制能够极大方便几大组件的信息和数据沟通。播送有利于程序间沟通音讯,例如在自己的运用程序内监听体系来电。
  1. 怎么运用播送?

  • 自定义一个BroadcastReceiver,在onReceive()办法中完结播送要处理的事务,比如这里的提示Toast信息。
public class MyReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,"你的网络状况产生改动~",Toast.LENGTH_SHORT).show();
   }
}
  • MainActivity.java中动态注册播送:
public class MainActivity extends AppCompatActivity {
​
  MyBRReceiver myReceiver;
​
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //中心部分代码:
    myReceiver = new MyReceiver();
    IntentFilter itFilter = new IntentFilter();
    itFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    registerReceiver(myReceiver, itFilter);
   }
​
  //别忘了将播送撤销掉哦~
  @Override
  protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
   }
}
  • 咱们也能够在AndroidManifest.xml中静态注册:
<receiver android:name=".MyReceiver">
  <intent-filter>
    <action android:name = "android.net.conn.CONNECTIVITY_CHANGE">
  </intent-filter>
</receiver>
  • 动态注册的播送接纳器能够自在的控制注册、撤销,有很大的灵活性。但是只能在程序发动之后才干收到播送,此外,播送接纳器的刊出是在onDestroy()办法中的。所以播送接纳器的生命周期是和当时活动的生命周期共同。
  • 静态注册的播送不受程序是否发动的束缚,当运用程序封闭之后,还是能接纳到播送。
  1. 有序播送、无序播送。

  • 按照播送的属性区分,播送分两种:有序播送和无序播送。
  • 无序播送:又名一般播送,彻底异步,不会被某个播送接纳者终止,逻辑上能够被任何播送接纳者接纳到,假如在播送宣布之后,一切的播送接纳器简直都会在同时接纳到这条播送音讯,因而它们之间没有任何先后次序可言。长处是功率较高。缺陷是一个接纳者不能将处理成果传递给下一个接纳者,并无法停止播送intent的传达。Context.sendBroadcast() 发送的是一般播送,一切订阅者都有时机取得并进行处理。
  • 有序播送:按照被接纳者的优先级次序,在被接纳者中依次传达。比如有三个播送接纳者A,B,C,优先级次序是A > B > C。那这个音讯先传递给A,再传给B,最终传给C。因而常常需求在AndroidManifest.xml 中进行注册,优先等级声明在intent-filter 元素的android:priority 属性中,数值越大优先等级越高,取值范围:-1000 到1000,优先等级也能够调用IntentFilter 目标的setPriority()进行设置。
  • 有序播送的接纳者能够停止播送的传达,播送的传达一旦停止,后边的接纳者就无法接纳到播送,有序播送的接纳者能够将数据传递给下一个接纳者,如:A 得到播送后,能够往它的成果目标中存入数据,当播送传给B 时,B 能够从A 的成果目标中得到A 存入的数据。Context.sendOrderedBroadcast() 发送的是有序播送。Bundlebundle = getResultExtras(true))能够获取上一个接纳者存入在成果目标中的数据。
  1. Android中常用的体系播送。

  • 体系播送是指体系作为播送的发送方,宣布来的播送,咱们能够在运用程序中经过监听这些播送来得到各种体系的状况信息。
//封闭或翻开飞翔模式时的播送
Intent.ACTION_AIRPLANE_MODE_CHANGED;
​
//充电状况,或许电池的电量产生改动。电池的充电状况、电荷等级改动,不能经过组成声明接纳这个播送,只要经过Context.registerReceiver()注册
Intent.ACTION_BATTERY_CHANGED;
​
//表明电池电量低
Intent.ACTION_BATTERY_LOW;
​
//表明电池电量足够,即从电池电量低改动到丰满时会宣布播送
Intent.ACTION_BATTERY_OKAY;
​
//在体系发动完结后,这个动作被播送一次(只要一次)。
Intent.ACTION_BOOT_COMPLETED;
​
//按下照相时的摄影按键(硬件按键)时宣布的播送
Intent.ACTION_CAMERA_BUTTON;
​
//当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android体系都会播送此Action音讯
Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
​
//设备当时设置被改动时宣布的播送(包含的改动:界面语言,设备方向,等,请参阅Configuration.java)
Intent.ACTION_CONFIGURATION_CHANGED;
​
//设备日期产生改动时会宣布此播送
Intent.ACTION_DATE_CHANGED;
//用户重新开始一个包,包的一切进程将被杀死,一切与其联系的运行时刻状况应该被移除,包含包名(重新开始包程序不能接纳到这个播送)
Intent.ACTION_PACKAGE_RESTARTED;
​
//插上外部电源时宣布的播送
Intent.ACTION_POWER_CONNECTED;
​
//已断开外部电源连接时宣布的播送
Intent.ACTION_POWER_DISCONNECTED;
​
Intent.ACTION_PROVIDER_CHANGED;////重启设备时的播送
Intent.ACTION_REBOOT;
​
//屏幕被封闭之后的播送
Intent.ACTION_SCREEN_OFF;
​
//屏幕被翻开之后的播送
Intent.ACTION_SCREEN_ON;
​
//封闭体系时宣布的播送
Intent.ACTION_SHUTDOWN;
​
//时区产生改动时宣布的播送
Intent.ACTION_TIMEZONE_CHANGED;
​
//时刻被设置时宣布的播送
Intent.ACTION_TIME_CHANGED;
​
//播送:当时时刻现已改动(正常的时刻流逝), 当时时刻改动,每分钟都发送,不能经过组件声明来接纳
,只要经过Context.registerReceiver()办法来注册
Intent.ACTION_TIME_TICK;
​
//一个用户ID现已从体系中移除宣布的播送
Intent.ACTION_UID_REMOVED;
​
  1. 播送的原理。

  • 从完成原理看上,Android中的播送运用了观察者模式,基于音讯的发布/订阅事情模型。因而,从完成的视点来看,Android中的播送将播送的发送者和承受者进行了极大程度上解耦,使得体系能够简单集成,更易扩展。详细完成流程要点如下:

    1.播送接纳者BroadcastReceiver经过Binder机制向AMS(Activity Manager Service)进行注册;

    2.播送发送者经过binder机制向AMS发送播送;

    3.AMS查找契合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将播送发送到BroadcastReceiver(一般情况下是Activity)相应的音讯循环队列中;

    4.音讯循环履行得到此播送,回调BroadcastReceiver中的onReceive()办法。 对于不同的播送类型,以及不同的BroadcastReceiver注册方法,详细完成上会有不一样。

  • 播送发送者和播送接纳者别离归于观察者模式中的音讯发布和订阅两头,AMS是处理中心。播送发送者和播送接纳者的履行是异步的,宣布去的播送不会关怀有无接纳者接纳,也不确定接纳者到底是何时才干接纳到。
  • 对Binder和AMS常识不熟悉的话能够翻阅前面讲解Binder和AMS的原理章节,学习其中的内容。

总结

有序播送是播送中比较特别的类型,播送承受者接纳播送的时刻是不一样的,它们之间是有先后次序的。体系经过priority的大小来摆放优先等级,数值越大等级越高。播送的传达能够按照优先等级逐个传递下去,也能够在某一接纳者处中断,那样后边的接纳者就无法收到播送。

今日分享到此结束,对你有帮助的话,点个赞再走呗,下期更精彩~

重视大众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已构成PDF版

内容如下

1.Android车载运用开发体系学习指南(附项目实战)
2.Android Framework学习指南,助力成为体系级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习道路+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技能解析与实战,跨渠道首要之选
7.Kotlin从入门到实战,全方面提高架构根底
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 功能优化实战+360全方面功能调优
10.Android零根底入门到精通,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )