1、A-Activity跳转到B-Activity经历的生命周期
A启动
A-onCreate A-onStart A-onResume
A跳转到B
A-onPause B-onCreate B-onStart B-onResume A-onStop
关闭B回到A
B-onPause A-onRestart A-onStart A-onResume B-onStop B-onDestory
2、Activity的4种启动模式
Standard
默认的启动模式,每次启动Activity,无论任务栈中是否有该Activity实例,都会新建一个新的实例。
SingleTop
如果Activity已经位于栈顶,系统不会创建新的Activity实例,否者创建新的实例。
SingleTask
Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。
SingleInstance
启动Activity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。
Activity的onNewIntent()方法何时会被调用
前提:ActivityA已经启动过,处于当前应用的Activity堆栈中;
当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法
当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法
当ActivityA的LaunchMode为Standard时,由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法
3、String、StringBuffer与StringBuilder的区别
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象
StringBuffer和StringBuilder底层是 char[]数组实现的
StringBuffer是线程安全的,而StringBuilder是线程不安全的
4、ArrayList和LinkedList的区别
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
5、Java中equals,hashcode和==的区别
==
基本数据类型(byte,short,char,int,long,float,double,boolean),==比较的是它们的值。
引用数据类型(类、接口、数组),==比较的是它们在内存中的存放地址。
equals
默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。
hashcode
Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。
eqauls和hashCode的关系
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
6、抽象类和接口
抽象类的意义
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
接口的意义
1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。
2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。
3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类,可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦,如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
抽象类和接口区别
1、抽象类和接口最大的区别,就是抽象类可以提供某些方法的部分实现,而接口只能定义方法,不能有方法的实现,如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个 新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
2、一个类只能继承一个抽象类或普通类,但能实现多个接口。
7、View的绘制流程
measure:对于View,measure实现其宽高的测量,对于ViewGroup,measure不仅要完成自身的测量,还要完成其子View的测量。
layout:用于确定子元素的位置。
draw:将View绘制在屏幕上。
8、Android中的String、StringBuilder、StringBuffer、CharSequence
Android中的String、StringBuilder、StringBuffer、CharSequence9、Canvas的常用操作速查表
Canvas的常用操作速查表10、Path常用方法表
Path常用方法表11、判断RecyclerView位置
滑到最顶部时,返回false,表示不能下拉了
RecyclerView.canScrollVertically(-1)
滑到最底部时,返回false,表示不能上拉了
RecyclerView.canScrollVertically(1)
fun getScreenSizeInches(activity: Activity): Double {
val display = activity.windowManager.defaultDisplay ?: return 0.0
val displayMetrics = DisplayMetrics()
display.getMetrics(displayMetrics)
val dens = displayMetrics.densityDpi
val x = Math.pow(displayMetrics.widthPixels.toDouble() / dens, 2.0)
val y = Math.pow(displayMetrics.heightPixels.toDouble() / dens, 2.0)
return Math.sqrt(x + y)
}
网友评论