乐趣区

关于android:1549页Android最新面试题含答案

在今年年初的疫情中,成了就业人员之一,于是各种筹备面试,发现面试题网上很多,然而都是很凌乱的,而且一个中央一点,没有一个零碎的面试题库,有题库有的没有答案或者是答案很简洁,没有达到面试的要求。所以始终想零碎的整顿一份面试题。

最近终于得闲花了将近一个月的工夫整顿了一份面试题库。这些面试题,包含我自己本人去面试遇到的,还有其余人员去面试遇到的,我都对立的整顿了一下,心愿对大家有用。作者不易,如有谬误望见谅。

一、java 面试题(根底 + 进阶)(必须)

1.java 中 == 和 equals 和 hashCode 的区别

== 是运算符,用来比拟两个值、两个对象的内存地址是否相等;
equals 是 Object 类的办法,默认状况下比拟两个对象是否是同一个对象,外部实现是通过“==”来实现的。
如果想比拟两个对象的其余内容,则能够通过重写 equals 办法,
hashCoed 也是 Object 类外面的办法,返回值是一个对象的哈希码,同一个对象哈希码肯定相等,但不同对象哈希码也有可能相等。
1、如果两个对象 equals,Java 运行时环境会认为他们的 hashcode 肯定相等。
2、如果两个对象不 equals,他们的 hashcode 有可能相等。
3、如果两个对象 hashcode 相等,他们不肯定 equals。
4、如果两个对象 hashcode 不相等,他们肯定不 equals。

2.int、char、long 各占多少字节数(口试题多呈现)

Int:4 字节 chat:2 字节 long\double:8 字节

3.int 与 integer 的区别(口试)

1、Integer 是 int 的包装类,int 则是 java 的一种根本数据类型
2、Integer 变量必须实例化后能力应用,而 int 变量不须要
3、Integer 理论是对象的援用,当 new 一个 Integer 时,实际上是生成一个指针指向此对象;而 int 则是间接存储数据值
4、Integer 的默认值是 null,int 的默认值是 0

4. 谈谈对 java 多态的了解

多态是指:父类援用指向子类对象,在执行期间判断所援用对象的理论类型,依据其理论的类型调用其相应的办法。(同一音讯能够依据发送对象的不同而采纳多种不同的行为形式。

多态的作用:打消类型之间的耦合关系。

实现多态的技术称为:动静绑定(dynamic binding),是指在执行期间判断所援用对象的理论类型,依据其理论的类型调用其相应的办法。

实现多态的三要素:继承,重写,父类援用指向子类对象(即,申明是父类,理论指向的是子类的一个对象)

5.String、StringBuffer、StringBuilder 区别

1、三者在执行速度上:StringBuilder > StringBuffer > String (因为 String 是常量,不可扭转,拼接时会从新创立新的对象)。
2、StringBuffer 是线程平安的,StringBuilder 是线程不平安的。(因为 StringBuffer 有缓冲区)

6. 什么是外部类?外部类的作用

外部类:将一个类定义在另一个类外面或者一个办法外面,这样的类称为外部类。
作用:1. 每个外部类都能独立的继承一个接口的实现,所以无论外部类是否曾经继承了某个 (接口的) 实现,对于外部类都没有影响。外部类使得多继承的解决方案变得残缺,
2. 不便将存在肯定逻辑关系的类组织在一起,又能够对外界暗藏。
3. 不便编写事件驱动程序
4. 不便编写线程代码

7. 抽象类和接口区别

雷同:
1、都能被继承
2、继承的类都必须将未实现的函数实现
3、只关注办法的定义,不关注办法的实现
差别:
1、一个子类能够继承多个接口,然而只能继承一个父类
2、抽象类在对象中只能示意一种对象,接口能够被很多对象继承

8. 抽象类与接口的利用场景

如果你领有一些办法并且想让它们中的一些有默认实现,那么应用抽象类吧。
如果你想实现多重继承,那么你必须应用接口。因为 Java 不反对多继承,子类不可能继承多个类,但能够实现多个接口。因而你就能够应用接口来解决它。
如果基本功能在一直扭转,那么就须要应用抽象类。如果一直扭转基本功能并且应用接口,那么就须要扭转所有实现了该接口的类。

9. 抽象类是否能够没有办法和属性?

抽象类专用于派生出子类,子类必须实现抽象类所申明的形象办法,否则,子类仍是抽象类。
蕴含形象办法的类肯定是抽象类,但抽象类中的办法不肯定是形象办法。
抽象类中能够没有形象办法,但有形象办法的肯定是抽象类。所以,java 中 抽象类外面能够没有形象办法。抽象类的作用在于子类对其的继承和实现,也就是多态;而没有形象办法的抽象类的存在价值在于:实例化了没有意义,因为类曾经定义好了,不能扭转其中的办法体,然而实例化进去的对象却满足不了要求,只有继承并重写了他的子类能力满足要求。所以才把它定义为没有形象办法的抽象类

10. 泛型中 extends 和 super 的区别

1、< extends T> 限定参数类型的上界:参数类型必须是 T 或 T 的子类型
限定参数类型的下界:参数类型必须是 T 或 T 的超类型
2、只能用于办法返回,通知编译器此返参的类型的最小继承边界为 T,T 和 T 的父类都能接管,然而入参类型无奈确定,只能承受 null 的传入
只能用于限定办法入参,通知编译器入参只能是 T 或其子类型,而返参只能用 Object 类接管既不能用于入参也不能用于返参

11. 父类的静态方法是否被子类重写

不能,父类的静态方法可能被子类继承,然而不可能被子类重写,即便子类中的静态方法与父类中的静态方法齐全一样,也是两个齐全不同的办法。

12. 过程和线程的区别(问的蛮多的,答复的时候用书面语说进去,不要背书)

过程是 cpu 资源分配的最小单位,线程是 cpu 调度的最小单位。
过程之间不能共享资源,而线程共享所在过程的地址空间和其它资源。
一个过程内可领有多个线程,过程可开启过程,也可开启线程。
一个线程只能属于一个过程,线程可间接应用同过程的资源, 线程依赖于过程而存在。

13.final,finally,finalize 的区别

final: 润饰类、成员变量和成员办法,类不可被继承,成员变量不可变,成员办法不可重写
finally: 与 try…catch… 独特应用,确保无论是否出现异常都能被调用到
finalize: 类的办法, 垃圾回收之前会调用此办法, 子类能够重写 finalize() 办法实现对资源的回收

14.Serializable 和 Parcelable 的区别

Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量长期变量的生成,外部执行大量的 i / o 操作,效率很低。

Parcelable Android 序列化接口 效率高 应用麻烦 在内存中读写(AS 有相干插件 一键生成所需办法),对象不能保留到磁盘中。

15. 动态属性和静态方法是否能够被继承?是否能够被重写?以及起因?

可继承 不可重写 而是被暗藏
如果子类外面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为 ” 暗藏 ”。如果你想要调用父类的静态方法和属性,间接通过父类名. 办法或变量名实现。

16. 成员外部类、动态外部类、部分外部类和匿名外部类的了解,以及我的项目中的利用

java 中外部类次要分为成员外部类、部分外部类 (嵌套在办法和作用域内)、匿名外部类(没构造方法)、动态外部类(static 润饰的类,不能应用任何外围类的非 static 成员变量和办法,不依赖外围类)
应用外部类最吸引人的起因是:每个外部类都能独立地继承一个(接口的)实现,所以无论外围类是否曾经继承了某个(接口的)实现,对于外部类都没有影响。
因为 Java 不反对多继承,反对实现多个接口。但有时候会存在一些应用接口很难解决的问题,这个时候咱们能够利用外部类提供的、能够继承多个具体的或者形象的类的能力来解决这些程序设计问题。能够这样说,接口只是解决了局部问题,而外部类使得多重继承的解决方案变得更加残缺。

17.string 转换成 integer 的形式及原理

String —>integer Intrger.parseInt(string);
Integer—> string Integer.toString();
原理:
parseInt(String s)– 外部调用 parseInt(s,10)(默认为 10 进制)
失常判断 null,进制范畴,length 等
判断第一个字符是否是符号位
循环遍历确定每个字符的十进制值
通过 *= 和 -= 进行计算拼接
判断是否为负值 返回后果。

18. 哪些状况下的对象会被垃圾回收机制解决掉?

1. 所有实例都没有流动线程拜访。
2. 没有被其余任何实例拜访的循环援用实例。
3.Java 中有不同的援用类型。判断实例是否合乎垃圾收集的条件都依赖于它的援用类型。
要判断怎么的对象是没用的对象。这里有 2 种办法:
1. 采纳标记计数的办法:
给内存中的对象给打上标记,对象被援用一次,计数就加 1,援用被开释了,计数就减一,当这个计数为 0 的时候,这个对象就能够被回收了。当然,这也就引发了一个问题:循环援用的对象是无奈被辨认进去并且被回收的。所以就有了第二种办法:
2. 采纳根搜索算法:
从一个根登程,搜寻所有的可达对象,这样剩下的那些对象就是须要被回收的

19. 动态代理和动静代理的区别,什么场景应用?

由程序员创立或由特定工具主动生成源代码,再对其编译。在程序运行前,代理类的.class 文件就曾经存在了。动静代理类:在程序运行时,使用反射机制动态创建而成。
场景:驰名的 Spring 框架、Hibernate 框架等等都是动静代理的应用例子

20.Java 的异样体系

Throwable,Error,Exception

21. 谈谈你对解析与分派的意识。

解析:Java 中办法调用的指标办法在 Class 文件外面都是常量池中的符号援用,在类加载的解析阶段,会将其中的一部分符号援用转化为间接援用。这种解析的前提是:办法在程序真正运行之前就有一个能够确定的调用版本,并且这个办法的调用版本在运行期是不可扭转的,即“编译期可知,运行期不可变”,这类指标的办法的调用称为解析(Resolve)。

只有能被 invokestatic 和 invokespecial 指令调用的办法,都能够在解析阶段中确定惟一的调用版本,符合条件的有静态方法(invokestatic 指令)、公有办法、实例构造方法、父类办法(这 3 个是 invokespecial 指令),它们在类加载的的解析阶段就会将符号援用解析为该办法的间接援用。
分派:分派是多态性的体现,Java 虚拟机底层提供了咱们开发中“重载”(Overload)“和重写”(Override)的底层实现。其中重载属于动态分派,而重写则是动静分派的过程。
解析调用肯定是个动态的过程,在编译期就齐全确定,在类加载的解析阶段就将波及的符号援用全副转变为能够确定的间接援用,不会提早到运行期再去实现。

22.Java 中实现多态的机制是什么?

答:办法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同体现
重写 Overriding 是父类与子类之间多态性的一种体现
重载 Overloading 是一个类中多态性的一种体现.

23. 说说你对 Java 反射的了解

JAVA 反射机制是在运行状态中, 对于任意一个类, 都可能晓得这个类的所有属性和办法; 对于任意一个对象, 都可能调用它的任意一个办法和属性。从对象登程,通过反射(Class 类)能够获得获得类的残缺信息(类名 Class 类型,所在包、具备的所有办法 Method[]类型、某个办法的残缺信息(包含修饰符、返回值类型、异样、参数类型)、所有属性 Field[]、某个属性的残缺信息、结构器 Constructors),调用类的属性或办法本人的总结:在运行过程中取得类、对象、办法的所有信息。

24. 说说你对 Java 注解的了解

元注解
元注解的作用就是负责注解其余注解。java5.0 的时候,定义了 4 个规范的 meta-annotation 类型,它们用来提供对其余注解的类型作阐明。
1.@Target
2.@Retention
3.@Documented
4.@Inherited

因为篇幅无限,只能分享局部面试题,更多面试题及答案能够我的【Github】浏览下载哦~ 无偿分享给大家,算是一个感恩回馈吧


二、Android 面试题(根底 + 进阶)(必须)

1. 四大组件是什么(这个不晓得的话,没必要去面试了,转行吧)

Android 四大组件有 Activity,Service 服务,Content Provider 内容提供,BroadcastReceiver。

2. 四大组件的生命周期和简略用法

activity:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

Service:
service 启动形式有两种,一种是通过 startService()形式进行启动,另一种是通过 bindService()形式进行启动。不同的启动形式他们的生命周期是不一样.
通过 startService()这种形式启动的 service,生命周期是这样:调用 startService() –> onCreate()–> onStartConmon()–> onDestroy()。这种形式启动的话,须要留神一下几个问题,第一:当咱们通过 startService 被调用当前,屡次在调用 startService(),onCreate()办法也只会被调用一次,而 onStartConmon()会被屡次调用当咱们调用 stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当咱们通过 startService 启动时候,通过 intent 传值,在 onStartConmon()办法中获取值的时候,肯定要先判断 intent 是否为 null。

通过 bindService()形式进行绑定,这种形式绑定 service,生命周期走法:bindService–>onCreate()–>onBind()–>unBind()–>onDestroy() bingservice 这种形式进行启动 service 益处是更加便当 activity 中操作 service,比方退出 service 中有几个办法,a,b,如果要在 activity 中调用,在须要在 activity 获取 ServiceConnection 对象,通过 ServiceConnection 来获取 service 中外部类的类对象,而后通过这个类对象就能够调用类中的办法,当然这个类须要继承 Binder 对象

contentProvider:contentProvider 的生命周期、了解应该跟过程一样,它作为零碎利用组件、其生命周期应该跟 app 利用的生命周期相似,只是它属于零碎利用、所以随系统启动而初始化,随零碎关机而完结;但也存在其余状态下完结过程、比如说零碎内存不够时,进行内存回收、会依据生成工夫态、用户操作等状况进行是否内存回收。

BroadcastReceiver:播送的生命周期从调用开始到 onReceiver 执行结束完结,须要留神的是,个别播送的生命周期都极短,须要在 10s 内解决完 onReceiver 中的所有工作,所以,个别不进行耗时长的工作,如果有耗时长的工作,该当通过 Intent 传递给 Service 进行解决。(留神,不要在 onReceiver 中开启线程进行耗时工作解决,否则,在 10s 后,该线程会变成空线程,从而导致工作的失落。同样的,也不要应用 bindService 来绑定服务。)
值得注意的是,如果是在代码中动静注册的播送,如:在 Activity 注册,那么在 Activity 的 onDestory 中须要应用 unregisterReceiver 登记播送。

3.Activity 之间的通信形式

Intent
借助类的动态变量
借助全局变量 /Application
借助内部工具
借助 SharedPreference
应用 Android 数据库 SQLite
赤裸裸的应用 File
Android 剪切板
借助 Service

4. 横竖屏切换的时候,Activity 各种状况下的生命周期

分两种状况:
1. 不设置 Activity 的 android:configChanges,或设置 Activity 的 android:configChanges=”orientation”,或设置 Activity 的 android:configChanges=”orientation|keyboardHidden”,切屏会从新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
横竖屏切换造成 activity 的生命周期
onPause()-onSaveInstanceState()-onStop()-onDestroy()-onCreat()-onStart()-onRestoreInstanceState()-onResume() 即会导致 activity 的销毁和重建。

2. 配置 android:configChanges=”orientation|keyboardHidden|screenSize”,才不会销毁 activity,且只调用 onConfigurationChanged 办法。
onSaveInstanceState() 与 onRestoreIntanceState() 资源相干的系统配置产生扭转或者资源有余时 (例如屏幕旋转),以后 Activity 会销毁,并且在 onStop 之前回调 onSaveInstanceState 保留数据,在从新创立 Activity 的时候在 onStart 之后回调 onRestoreInstanceState。其中 Bundle 数据会传到 onCreate(不肯定有数据)和 onRestoreInstanceState(肯定有数据)。
用户或者程序员被动去销毁一个 Activity 的时候不会回调(如代码中 finish()或用户按下 back,不会回调),其余状况都会调用,来保留界面信息。

5.Activity 与 Fragment 之间生命周期比拟

a. 在创立的过程中,是 Activity 率领 Fragment 执行生命周期的办法,所以它们生命周期执行的程序如下:

Activity — onCreate(),
Fragment — onAttach() -> onCreate() -> onCreateView() -> onActivityCreated



Activity — onStart()

Fragment — onStart()


Activity — onResume()

Fragment — onResume()


最初,在销毁时是 Fragment 率领 Activity 执行生命周期的办法:

Fragment — onPause()

Activity — onPause()


Fragment — onStop()

Activity — onStop()


Fragment — onDestroyView() -> onDestroy() -> onDetach()

Activity — onDestroy()

6.Activity 上有 Dialog 的时候按 Home 键时的生命周期

有 Dialog 和 无 Dialog 按 Home 键成果一样:

失常启动: onCreate() -> onStart() -> onResume()
按 home 键: onPause() -> onStop()
再次启动: onRestart() -> onStart() -> onResume()

7. 两个 Activity 之间跳转时必然会执行的是哪几个办法?

a. 失常状况下 Activity A 跳转到 Activity B 时:
A 调用 onCreate() 办法 -> onStart() 办法 -> onResume() 办法,此时 A 前台可见。当 A 跳转到 B 时,A 调用 onPause() 办法,而后调用新的 Activity B 中的 onCreate() 办法 -> onStart() 办法 -> onResume() 办法。最初 A 再调用 onStop()办法。
b. 当 Activity B 为通明主题时:
除了最初 Activity A 不调用 onStop() 办法之外,其它都和 a 中的一样。

8.Activity 的四种启动模式比照

此处延长:栈 (First In Last Out) 与队列 (First In First Out) 的区别
区别:队列先进先出,栈先进后出
对插入和删除操作的 ” 限定 ”。栈是限定只能在表的一端进行插入和删除操作的线性表。队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
遍历数据速度不同

standard 模式

这是默认模式,每次激活 Activity 时都会创立 Activity 实例,并放入工作栈中。应用场景:大多数 Activity。

singleTop 模式

如果在工作的栈顶正好存在该 Activity 的实例,就重用该实例(会调用实例的 onNewIntent() ),否则就会创立新的实例并放入栈顶,即便栈中曾经存在该 Activity 的实例,只有不在栈顶,都会创立新的实例。应用场景如新闻类或者浏览类 App 的内容页面。

singleTask 模式

如果在栈中曾经有该 Activity 的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因而在它下面的实例将会被移出栈。如果栈中不存在该实例,将会创立新的实例放入栈中。应用场景如浏览器的主界面。不论从多少个利用启动浏览器,只会启动主界面一次,其余状况都会走 onNewIntent,并且会清空主界面下面的其余页面。

singleInstance 模式

在一个新栈中创立该 Activity 的实例,并让多个利用共享该栈中的该 Activity 实例。一旦该模式的 Activity 实例曾经存在于某个栈中,任何利用再激活该 Activity 时都会重用该栈中的实例(会调用实例的 onNewIntent() )。其成果相当于多个利用共享一个利用,不论谁激活该 Activity 都会进入同一个利用中。应用场景如闹铃揭示,将闹铃揭示与闹铃设置拆散。singleInstance 不要用于两头页面,如果用于两头页面,跳转会有问题,比方:A -> B (singleInstance) -> C,齐全退出后,在此启动,首先关上的是 B。

9.Activity 状态保留于复原

当 Activity 在异常情况 (零碎内存不足或者系统配置产生了扭转等) 被销毁重建后,在销毁的时候 Activity 会调用 onSaveInstanceState() 办法用于保留 Activity 相干的状态和数据,而后在重建后的 Activity 的中咱们能够通过 onCreate() 或者 onRestoreInstanceState() 办法复原数据,这里咱们须要留神的是如果通过 onCreate() 办法复原,那么得先判断它的 intent 参数 是否为空,如果在 onRestoreInstanceState() 办法复原就不会,因为只有 onRestoreInstanceState() 办法被调用就阐明肯定有数据,不会为空。Google 举荐应用 onRestoreInstanceState() 办法。

10. 如何实现 Fragment 的滑动?

将 Fragment 与 viewpager 绑定,通过 viewpager 中的 touch 事件,会进行 move 事件的滑动解决。

11.fragment 之间传递数据的形式?

1、在 fragment 中设置一个办法,而后进行调用
2、采取接口回调的形式进行数据传递。
3、播送或者是应用三方开源框架:EventBus

12.Activity 怎么和 Service 绑定?怎么在 Activity 中启动本人对应的 Service?

1、activity 能进行绑定得益于 Serviece 的接口。为了反对 Service 的绑定,实现 onBind 办法。
2、Service 和 Activity 的连贯能够用 ServiceConnection 来实现。须要实现一个新的 ServiceConnection,重现 onServiceConnected 和 OnServiceDisconnected 办法,一旦连贯建设,就能失去 Service 实例的援用。
3、执行绑定,调用 bindService 办法,传入一个抉择了要绑定的 Service 的 Intent(显示或隐式)和一个你实现了的 ServiceConnection 的实例

13.service 和 activity 怎么进行数据交互?

1. 通过 broadcast: 通过播送发送音讯到 activitry
2. 通过 Binder:通过与 activity 进行绑定
(1)增加一个继承 Binder 的外部类,并增加相应的逻辑办法。
(2)重写 Service 的 onBind 办法,返回咱们刚刚定义的那个外部类实例。
(3)Activity 中创立一个 ServiceConnection 的匿名外部类,并且 重 写 里 面 的 onServiceConnected 方 法 和 onServiceDisconnected 办法,这两个办法别离会在流动与服务胜利绑定以及解除绑定的时候调用(在 onServiceConnected 办法中,咱们能够失去一个方才那个 service 的 binder 对象,通过对这个 binder 对象进行向下转型,失去咱们那个自定义的 Binder 实例,有了这个实例,做能够调用这个实例外面的具体方法进行须要的操作了)。

14.Service 的开启形式,请形容一下 Service 的生命周期,请形容一下 Service 的生命周期

service 启动形式有两种,一种是通过 startService()形式进行启动,另一种是通过 bindService()形式进行启动。不同的启动形式他们的生命周期是不一样.
通过 startService()这种形式启动的 service,生命周期是这样:调用 startService() –> onCreate()–> onStartConmon()–> onDestroy()。这种形式启动的话,须要留神一下几个问题,第一:当咱们通过 startService 被调用当前,屡次在调用 startService(),onCreate()办法也只会被调用一次,而 onStartConmon()会被屡次调用当咱们调用 stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当咱们通过 startService 启动时候,通过 intent 传值,在 onStartConmon()办法中获取值的时候,肯定要先判断 intent 是否为 null。
通过 bindService()形式进行绑定,这种形式绑定 service,生命周期走法:bindService–>onCreate()–>onBind()–>unBind()–>onDestroy() bingservice 这种形式进行启动 service 益处是更加便当 activity 中操作 service,比方退出 service 中有几个办法,a,b,如果要在 activity 中调用,在须要在 activity 获取 ServiceConnection 对象,通过 ServiceConnection 来获取 service 中外部类的类对象,而后通过这个类对象就能够调用类中的办法,当然这个类须要继承 Binder 对象

15. 请形容一下播送 BroadcastReceiver 的了解

播送,是一个全局的监听器,属于 Android 四大组件之一。Android 播送分为两个角色:播送发送者、播送接收者。作用是监听 / 接管 利用 App 收回的播送音讯,并 做出响应
可利用在:
Android 不同组件间的通信(含:利用内 / 不同利用之间)
多线程通信
与 Android 零碎在特定状况下的通信
如:电话呼入时、网络可用时

16.Broadcast 注册形式与区别(此处延长:什么状况下用动静注册)

Broadcast 播送,注册形式次要有两种.
第一种是动态注册,也可成为常驻型播送,这种播送须要在 Androidmanifest.xml 中进行注册,这中形式注册的播送,不受页面生命周期的影响,即便退出了页面,也能够收到播送这种播送个别用于想开机自启动啊等等,因为这种注册的形式的播送是常驻型播送,所以会占用 CPU 的资源。
第二种是动静注册,而动静注册的话,是在代码中注册的,这种注册形式也叫十分驻型播送,收到生命周期的影响,退出页面后,就不会收到播送,咱们通常使用在更新 UI 方面。这种注册形式优先级较高。最初须要解绑,否会会内存泄露
播送是分为有序播送和无序播送。

17. 本地播送和全局播送有什么差异?

BroadcastReceiver 是针对利用间、利用与零碎间、利用外部进行通信的一种形式
LocalBroadcastReceiver 仅在本人的利用内发送接管播送,也就是只有本人的利用能收到,数据更加平安播送只在这个程序里,而且效率更高。

18.BroadcastReceiver,LocalBroadcastReceiver 区别

一、利用场景不同
1、BroadcastReceiver 用于利用之间的传递音讯;
2、而 LocalBroadcastManager 用于利用外部传递音讯,比 broadcastReceiver 更加高效。
二、应用安全性不同
1、BroadcastReceiver 应用的 Content API,所以实质上它是跨利用的,所以在应用它时必须要思考到不要被别的利用滥用;
2、LocalBroadcastManager 不须要思考平安问题,因为它只在利用外部无效。

19.AlertDialog,popupWindow 区别

(1)Popupwindow 在显示之前肯定要设置宽高,Dialog 无此限度。
(2)Popupwindow 默认不会响应物理键盘的 back,除非显示设置了 popup.setFocusable(true); 而在点击 back 的时候,Dialog 会隐没。
(3)Popupwindow 不会给页面其余的局部增加蒙层,而 Dialog 会。
(4)Popupwindow 没有题目,Dialog 默认有题目,能够通过 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 勾销题目
(5)二者显示的时候都要设置 Gravity。如果不设置,Dialog 默认是 Gravity.CENTER。
(6)二者都有默认的背景,都能够通过 setBackgroundDrawable(new ColorDrawable(android.R.color.transparent)); 去掉。
最实质的区别:AlertDialog 是非阻塞式对话框:AlertDialog 弹出时,后盾还能够做事件;而 PopupWindow 是阻塞式对话框:PopupWindow 弹出时,程序会期待,在 PopupWindow 退出前,程序始终期待,只有当咱们调用了 dismiss 办法的后,PopupWindow 退出,程序才会向下执行。

20. 解说一下 Context

Context 是一个形象基类。在翻译为上下文,也能够了解为环境,是提供一些程序的运行环境根底信息。Context 下有两个子类,ContextWrapper 是上下文性能的封装类,而 ContextImpl 则是上下文性能的实现类。而 ContextWrapper 又有三个间接的子类,ContextThemeWrapper、Service 和 Application。其中,ContextThemeWrapper 是一个带主题的封装类,而它有一个间接子类就是 Activity,所以 Activity 和 Service 以及 Application 的 Context 是不一样的,只有 Activity 须要主题,Service 不须要主题。Context 一共有三种类型,别离是 Application、Activity 和 Service。这三个类尽管别离各种承当着不同的作用,但它们都属于 Context 的一种,而它们具体 Context 的性能则是由 ContextImpl 类去实现的,因而在绝大多数场景下,Activity、Service 和 Application 这三种类型的 Context 都是能够通用的。不过有几种场景比拟非凡,比方启动 Activity,还有弹出 Dialog。出于平安起因的思考,Android 是不容许 Activity 或 Dialog 凭空出现的,一个 Activity 的启动必须要建设在另一个 Activity 的根底之上,也就是以此造成的返回栈。而 Dialog 则必须在一个 Activity 下面弹出(除非是 System Alert 类型的 Dialog),因而在这种场景下,咱们只能应用 Activity 类型的 Context,否则将会出错。
getApplicationContext()和 getApplication()办法失去的对象都是同一个 application 对象,只是对象的类型不一样。
Context 数量 = Activity 数量 + Service 数量 + 1(1 为 Application)

21.Android 属性动画个性

(1) 对任意对象的属性执行动画操作:属性动画容许对任意对象的属性执行动画操作,因为属性动画的性质是通过反射实现的。
(2)可扭转背景色彩。
(3)真正扭转 View 自身:因为是通过反射扭转其属性,并刷新,如扭转 width,他会搜寻 getWidth(), 反射获取,再通过进行某种计算,将值通过 setWidth()设置进去并更新。

22.LinearLayout、RelativeLayout、FrameLayout 的个性及比照,并介绍应用场景。

RelativeLayout 的 onMeasure 过程
依据源码咱们发现 RelativeLayout 会依据 2 次排列的后果对子 View 各做一次 measure。
首先 RelativeLayout 中子 View 的排列形式是基于彼此的依赖关系,在确定每个子 View 的地位的时候,须要先给所有的子 View 排序一下,所以须要横向纵向别离进行一次排序测量

23.LinearLayout 的 onMeasure 过程

LinearLayout 会先做一个简略横纵方向判断
须要留神的是在每次对 child 测量结束后,都会调用 child.getMeasuredHeight()/getMeasuredWidth()获取该子视图最终的高度,并将这个高度增加到 mTotalLength 中。
然而 getMeasuredHeight 临时避开了 lp.weight>0 且高度为 0 子 View,因为前面会将把残余高度按 weight 调配给相应的子 View。因而能够得出以下论断:
(1)如果咱们在 LinearLayout 中不应用 weight 属性,将只进行一次 measure 的过程。(如果应用 weight 属性,则遍历一次 wiew 测量后,再遍历一次 view 测量)
(2)如果应用了 weight 属性,LinearLayout 在第一次测量时获取所有子 View 的高度,之后再将残余高度依据 weight 加到 weight>0 的子 View 上。由此可见,weight 属性对性能是有影响的。
1)RelativeLayout 慢于 LinearLayout 是因为它会让子 View 调用 2 次 measure 过程,而 LinearLayout 只需一次,然而有 weight 属性存在时,LinearLayout 也须要两次 measure。
2)在不响应层级深度的状况下,应用 Linearlayout 而不是 RelativeLayout。

24. 谈谈对接口与回调的了解

接口回调就是指: 能够把应用某一接口的类创立的对象的援用赋给该接口申明的接口变量,那么该接口变量就能够调用被类实现的接口的办法。实际上,当接口变量调用被类实现的接口中的办法时,就是告诉相应的对象调用接口的办法,这一过程称为对象性能的接口回调。

25.Android 中 View,SurfaceView 和 GLSurfaceView

View:显示视图,内置画布,提供图形绘制函数,触屏事件,按键事件函数;必须在 UI 线程中更新画面,速度较慢。
SurfaceView:基于 View 视图进行拓展的视图类,更适宜 2D 游戏的开发;是 View 的子类,相似双缓机制,在新的线程中更新画面,所以刷新界面速度比 View 快。(双缓机制:即前台缓存和后盾缓存,后盾缓存计算场景、产生画面,前台缓存显示后盾缓存已画好的画面。)
GLSurfaceView:基于 SurfaceView 视图再次进行扩大的视图类,专用于 3D 游戏开发的视图;是 SurfaceView 的子类,OpenGL 专用。(OpenGL:是一个凋谢的三维图形软件包。)

26. 序列化的作用,以及 Android 两种序列化的区别

作用:java 序列化次要有 2 个作用:
对象长久化,对象生存在内存中,想把一个对象长久化到磁盘,必须已某种形式来组织这个对象蕴含的信息,这种形式就是序列化;
近程网络通信,内存中的对象不能间接进行网络传输,发送端把对象序列化成网络可传输的字节流,接收端再把字节流还原成对象。

Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量长期变量的生成,外部执行大量的 i / o 操作,效率很低。
Parcelable Android 序列化接口 效率高 应用麻烦 在内存中读写(AS 有相干插件 一键生成所需办法),对象不能保留到磁盘中

27. 差值器和估值器

差值器:依据工夫流逝的百分比计算以后属性扭转的百分比。
估值器:依据以后属性扭转的百分比计算扭转后的属性值

28.Android 中数据存储形式

1 应用 SharedPreferences 存储数据
适用范围:保留大量的数据,且这些数据的格局非常简单:字符串型、根本类型的值。
比方应用程序的各种配置信息(如是否关上音效等),解锁口 令明码等
外围原理:保留基于 XML 文件存储的 key-value 键值对数据,通常用来存储一些简略的配置信息。

2 文件存储数据
外围原理: Context 提供了两个办法来关上数据文件里的文件 IO 流:
FileInputStream openFileInput(String name);
FileOutputStream openFileOutput(String name , int mode)
3 SQLite 数据库存储数据
4 应用 ContentProvider 存储数据
5 网络存储数据
Requestlayout,onlayout,onDraw,DrawChild 区别与分割
requestLayout() 办法:会导致调用 measure()过程 和 layout()过程。阐明:只是对 View 树从新布局 layout 过程包含 measure()和 layout()过程,不会调用 draw()过程,但不会从新绘制 任何视图包含该调用者自身。
onLayout()办法 (如果该 View 是 ViewGroup 对象,须要实现该办法,对每个子视图进行布局)
调用 onDraw()办法绘制视图自身 (每个 View 都须要重载该办法,ViewGroup 不须要实现该办法)
drawChild()去从新回调每个子视图的 draw()办法

29.invalidate 和 postInvalidate 的区别及应用

1、postInvalidate() 办法在非 UI 线程中调用,告诉 UI 线程重绘。
2、invalidate()办法在 UI 线程中调用,重绘以后 UI。Invalidate 不能间接在线程中调用,因为他是违反了单线程模型:Android UI 操作并不是线程平安的,并且这些操作必须在 UI 线程中调用。

Activity-Window-View 三者的差异
这个问题真的很不好答复。所以这里先来个算是比拟失当的比喻来形容下它们的关系吧。Activity 像一个工匠(管制单元),Window 像窗户(承载模型),View 像窗花(显示视图)LayoutInflater 像剪刀,Xml 配置像窗花图纸。
1:Activity 结构的时候会初始化一个 Window,精确的说是 PhoneWindow。
2:这个 PhoneWindow 有一个“ViewRoot”,这个“ViewRoot”是一个 View 或者说 ViewGroup,是最初始的根视图。
3:“ViewRoot”通过 addView 办法来一个个的增加 View。比方 TextView,Button 等
4:这些 View 的事件监听,是由 WindowManagerService 来承受音讯,并且回调 Activity 函数。比方 onClickListener,onKeyDown 等。

30.ActivityThread,AMS,WMS 的工作原理

Activity 与 Window:
Activity 只负责生命周期和事件处理
Window 只管制视图
一个 Activity 蕴含一个 Window,如果 Activity 没有 Window,那就相当于 Service。

因为篇幅无限,只能分享局部面试题,更多面试题及答案能够我的【Github】浏览下载哦~ 无偿分享给大家,算是一个感恩回馈吧

退出移动版