Android 3.22面试题

2021-11-17  本文已影响0人  我要离开浪浪山

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五大存储

9. Activity中一般重载哪几个方法用来维护其生命周期。

Activitiy的生命周期方法主要有七个:onCreate()、onRestart()、onStart()、onResume()、onPause()、onStop()、onDestory()。

10.Android中的动画有几类,他们的特点和区别是什么?

有3种

11. Android中Pading和margin有什么不同?

padding是在控件内部的 margin是在控件外部的

12. 在单线程中模型中,Message,Handler,Message Queue,Looper之间的关系。

在主线程创建之后会创建一个Looper对象,创建Looper对象的时候会去创建一个MessageQueue,而Looper是一个轮询器,会不停的轮询MessageQueue中的消息,在获取到消息之后就会把这个消息交给相应的handler来进行处理,在主线程中创建一个handler对象,这个handler对象把一个Message放到消息队列中,然后获取到消息进行处理。

13. 简述一下LaunchMode的几种模式

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进程。在这个过程中主要进行服务管理器的初始化和注册。
上一篇 下一篇

猜你喜欢

热点阅读