Android基础知识

2018-02-25  本文已影响8人  猪爸爸Hulk

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、CharSequence

9、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)
    }
上一篇下一篇

猜你喜欢

热点阅读