Android 3.22面试题
1. 面向对象的三大特征
封装,继承,多态
2. 简述OverLoading(重载)和Override(重写)的区别
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同(多态的一种)。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
3. 说明String和StringBuffer,StringBuilder的区别:
运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
4. 汉字字符 2字节,英文字符 1字节,中文标点 2字节,英文标点 1字节
5. Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?
有两种实现方法, 分别是继承 Thread 类与实现 Runnable 接口 用 synchronized 关键字修饰同步方法
第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类的实例对象, 子类加上 run 方法后的代码如下:
new Thread(){
public void run(){
} }.start();
第二种: new Thread(new Runnable(){}).start();这表示调用 Thread 对象接受的 Runnable 对象的 run方法, new Runnable(){}表示一个 Runnable 的匿名子类的实例对象,runnable 的子类加上 run 方法后的代码如下:
new Thread(new Runnable(){
public void run(){
}
}).start();
6. 列出Android的四大组件
Activity,service,content provider,broadcast receiver
7.Android的6大布局
六大界面布局方式包括: 线性布局(LinearLayout)、框架布局(FrameLayout)、表格布局(TableLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)和网格布局(GridLayout) 、约束布局。
8. Android五大存储
- 1.SharedPreferences方式
- 2.SQLite数据库方式
- 3.内容提供器(Content provider)方式
- 4.文件存储方式
- 5.网络存储方式
9. Activity中一般重载哪几个方法用来维护其生命周期。
Activitiy的生命周期方法主要有七个:onCreate()、onRestart()、onStart()、onResume()、onPause()、onStop()、onDestory()。
10.Android中的动画有几类,他们的特点和区别是什么?
有3种
- a. Tween(补间动画):这种实现方式可以使视图组件移动、放大、缩小以及透明度的变化(假的,点击效果没有变)
- b. Frame(帧动画):通过顺序的播放图片来实现,类似电影
- c. 属性动画:补间动画只是显示位置的改变,点击事件仍在原处,而属性动画控件移动后事件相应就在就在移动后的本身处理。
11. Android中Pading和margin有什么不同?
padding是在控件内部的 margin是在控件外部的
12. 在单线程中模型中,Message,Handler,Message Queue,Looper之间的关系。
-
Looper:是一个消息分发器,在主线程创建的时候就会创建一个Looper对象;**
-
MessageQueue :消息队列,是由Message组成的一个队列;**
-
Handler :获取到Message,然后执行动作,可以在主线程和子线程中互相传递数据;**
在主线程创建之后会创建一个Looper对象,创建Looper对象的时候会去创建一个MessageQueue,而Looper是一个轮询器,会不停的轮询MessageQueue中的消息,在获取到消息之后就会把这个消息交给相应的handler来进行处理,在主线程中创建一个handler对象,这个handler对象把一个Message放到消息队列中,然后获取到消息进行处理。
13. 简述一下LaunchMode的几种模式
-
a.standard模式
在Activity的栈中无论该活动有没有加入栈,活动就会被创建。 -
b.singleTop模式
只要被创建的活动不位于栈的顶部,该活动就会被创建入栈。如果将要被创建的活动位于栈的顶部,该活动的实例就不会被创建 -
c.singleTask模式
在单任务模式下MainActivity已经在栈中,就会把它之前的Activity出栈,使其处于在栈顶活跃的位置。 -
d.singleInstance
可以看成单例模式,这个比较特殊,被设置成singleInstance的Activity将会放入另一个栈中,因为这样为了便于共用。上面3中模式位于同一个栈中。
14. 怎么实现跨进程访问?
startActivity, sendBroadcast,startService 使用都比较简单。通常使用在传递简单消息,通知另外一个进程。异步并且得不到反馈。AIDL是android推荐使用的,但是客户端调用稍微复杂,不利于接口封装(客户端必须先bind,然后才可以调用)。Messenger实际上是在AIDL的基础上进行了封装。可以更好的结合handler来使用,相对较为简单,但是也存在不利于接口封装的问题。本文我们主要想讲下provider来实现跨进程调用。
15. Android事件分发机制:
背景1:传递函数: dispatchTouchEvent。用于传递事件,本函数被定义在View中,ViewGroup重写了该函数。
背景2:拦截函数:onInterceptTouchEvent。用于拦截事件,本函数被定义在ViewGroup中。
背景3:消费函数1:onTouch。用于传递过来的事件消费掉,本函数是OnTouchLisener里面的需要被重写的函数。
背景4:消费函数2:onTouchEvent。同用于消费事件,本函数被定义于View中,比onTouch晚执行一步,可能不会执行。
16. 描述Android应用进程的启动及Activity的显示
根Activity一般就是指我们项目中的MainActivity,代表了一个android应用程序,一般也是在一个新的进程中启动起来。在Android系统中,所有的Activity组件都保存在堆栈中,我们启动一个新的Activity组件就位于上一个Activity的上面。那么我们从桌面(Launcher)打开一个App是一个怎样的过程呢,如下所示:
(1)Launcher向ActivityManagerService发送一个启动MainActivity的请求;
(2)ActivityManagerService首先将MainActivity的相关信息保存下来,然后向Launcher发送一个使之进入中止状态的请求;
(3)Launcher收到中止状态之后,就会想ActivityManagerService发送一个已进入中止状态的请求,便于ActivityManagerService继续执行启动MainActivity的操作; (4)ActivityManagerService检查用于运行MainActivity的进程,如果不存在,则启动一个新的进程;
(5)新的应用程序进程启动完成之后,就会向ActivityManagerService发送一个启动完成的请求,便于ActivityManagerService继续执行启动MainActivity的操作; (6)ActivityManagerService将第(2)步保存下来的MainActivity相关信息发送给新创建的进程,便于该进程启动MainActivity组件。
17. 简述Android启动过程
Android系统在启动时首先会启动Linux基础系统,然后引导加载Linux Kernel并启动初始化进程(Init)。接着启动Linux守护进程。在启动Linux守护进程的同时还需要启动Zygote进程。包括初始化一个Dalvik虚拟机实例。装载Socket请求所需的类和监听。创建虚拟机实例来管理应用程序的进程。
在Zygote之后需要初始化runtime进程。在这个过程中主要进行服务管理器的初始化和注册。