Android 面试题(一)
总阅读次
- 1. 面试所遇到的问题:
- 1.1. 1.显示Intent与隐式Intent的区别
- 1.2. 2.什么是线程池,线程池的作用是什么
- 1.3. 3.多任务多线程下载用到那些Android的技术
- 1.4. 4.IntentService的用法
- 1.5. 5.监听系统联系人列表状态变化
- 1.6. 6.serveice中如何通知Activity改变视图
- 1.7. 7.Acitivity后台闲置退出或异常退出,如何保存数据
- 1.8. 8.Handler的实现原理
- 1.9. 9.Android Holo主题与MD主题的理念,以及你的看法
- 1.10. 10.String,StringBuffer,StringBuilder有哪些不同
- 1.11. 11.浮点数的精准计算
- 1.12. 12.如何通过JNI传递String对象
- 1.13. 13.Context与ApplicationContext的区别,分别用在什么情况下
- 1.14. 14.View的绘制流程
- 1.15. 15.触摸屏幕的分发机制
- 1.16. 16.Android系统提供了那些动画机制
- 1.17. 17.java为什么跨平台
- 1.18. 18.Https与http
- 1.19. 19.Post与Get请求的区别
- 1.20. 20.Java GC 原理
- 1.21. 21.移动端跨平台开发
面试所遇到的问题:
1.显示Intent与隐式Intent的区别
对明确指出了目标组件名称的Intent,我们称之为“显式Intent”。
对于没有明确指出目标组件名称的Intent,则称之为“隐式 Intent”。
对于隐式意图,在定义Activity时,指定一个intent-filter,当一个隐式意图对象被一个意图过滤器进行匹配时,将有三个方面会被参考到:
动作(Action)
类别(Category [‘kætɪg(ə)rɪ] )
数据(Data )
|
|
2.什么是线程池,线程池的作用是什么
1.线程池
答:线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程池之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要访问网络,为了不阻塞主线程,每个步骤都创建个线程,在线程中和网络交互,用线程池就变的简单,线程池是对线程的一种封装,让线程用起来更加简便,只需要创一个线程池,把这些步骤像任务一样放进线程池,在程序销毁时只要调用线程池的销毁函数即可。
单个线程的弊端:a. 每次new Thread新建对象性能差b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或者OOM,c. 缺乏更多功能,如定时执行、定期执行、线程中断。
2、Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。ScheduledExecutorService比Timer更安全,功能更强大
(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
3.多任务多线程下载用到那些Android的技术
答:
这道面试题,主要是考察对多线程的理解和使用,还涉及到网络请求和文件操作,使用的技术多种多样,一般可以回答: 使用Handler(可以看No.8Handler的原理),AsyncTask的处理原理,没写过去百度一下,网上一堆教你怎么做的,不必死扣代码,只需要明白逻辑流程,能够完整流畅的说清楚为什么,这个题目也就回答到点子上了。
4.IntentService的用法
一、IntentService简介
IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题:
- Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;
- Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;
二、IntentService特征
- 会创建独立的worker线程来处理所有的Intent请求;
- 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
- 所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
- 为Service的onBind()提供默认实现,返回null;
- 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;
- IntentService不会阻塞UI线程,而普通Serveice会导致ANR异常
- Intentservice若未执行完成上一次的任务,将不会新开一个线程,是等待之前的任务完成后,再执行新的任务,等任务完成后再次调用stopSelf
5.监听系统联系人列表状态变化
答:通过ContentObserver的方式进行数据变化监听,要说清楚ContentObserver怎么用的,面试官有可能会问你观察者模式。最好是写一编观察者模式。理解后就好说明用法或者原理
6.serveice中如何通知Activity改变视图
答:
通过Binder对象
当Activity通过调用bindService(Intent service, ServiceConnection conn,int flags),我们可以得到一个Service的一个对象实例,然后我们就可以访问Service中的方法,从而根据数据不同来更新
通过BroadCast(广播)的形式
当我们的进度发生变化的时候我们发送一条广播,然后在Activity的注册广播接收器,接收到广播之后更新视图
7.Acitivity后台闲置退出或异常退出,如何保存数据
答:
通过 onSaveInstanceState() 和 onRestoreInstanceState() 保存和重启非持久化数据。
8.Handler的实现原理
答:
handler干了些什么:
运行在某个线程上,共享线程的消息队列;
接收消息、调度消息,派发消息和处理消息;
实现消息的异步处理;
建立消息处理模型/系统
参考博客
9.Android Holo主题与MD主题的理念,以及你的看法
答:
Holo Theme
Holo Theme 是 Android Design 的最基础的呈现方式。因为是最为基础的 Android Design 呈现形式,每一台 Android 4.X 的手机系统内部都有集成 Holo Theme 需要的控件,即开发者不需要自己设计控件,而是直接从系统里调用相应的控件。在 UI 方面没有任何的亮点,和 Android4.X 的设置/电话的视觉效果极度统一。由此带来的好处显而易见,这个应用作为 Android 应用的辨识度极高,且完全不可能与系统风格产生冲突。
Material Design
Material design其实是单纯一种设计语言,它包含了系统界面风格、交互、UI,更加专注拟真,更加大胆丰富的用色,更加丰富的交互形式,更加灵活的布局形式
1.鲜明、形象的界面风格,
2.色彩搭配使得应用看起来非常的大胆、充满色彩感,凸显内容
3.Material design对于界面的排版非常的重视
4.Material design的交互设计上采用的是响应式交互,这样的交互设计能把一个应用从简单展现用户所请求的信息,提升至能与用户产生更强烈、更具体化交互的工具。
10.String,StringBuffer,StringBuilder有哪些不同
答:
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
String每次变化一个值就会开辟一个新的内存空间
StringBuilder:线程非安全的
StringBuffer:线程安全的
对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
11.浮点数的精准计算
答:BigDecimal类进行商业计算,Float和Double只能用来做科学计算或者是工程计算
12.如何通过JNI传递String对象
答:
Java的String和C++的string是不能对等起来的,所以当我们拿到.h文件下面的jstring对象,会做一次转换我们把jstring转换为C下面的char*类型,
constchar* str;
str = env->GetStringUTFChars(prompt,false); 获取值
char* tmpstr =”return string succeeded”;
jstring rtstr = env->NewStringUTF(tmpstr);赋予值
13.Context与ApplicationContext的区别,分别用在什么情况下
答:
Application的Context是一个全局静态变量,SDK的说明是只有当你引用这个context的生命周期超过了当前activity的生命周期,而和整个应用的生命周期挂钩时,才去使用这个application的context。
在android中context可以作很多操作,但是最主要的功能是加载和访问资源。在android中有两种context,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。
14.View的绘制流程
答:
1.onmesarue() 为整个View树计算实际的大小
2.onlayout() 为将整个根据子视图的大小以及布局参数将View树放到合适的位置上
3.ondraw()
1 、绘制该View的背景
2 、为显示渐变框做一些准备操作(见5,大多数情况下,不需要改渐变框)
3、调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)
4、调用dispatchDraw ()方法绘制子视图(如果该View类型不为ViewGroup,即不包含子视图,不需要重载该方法)
15.触摸屏幕的分发机制
答:
1、基础知识
(1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。
(2) 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以ACTION_DOWN开始ACTION_UP结束。
(3) 对事件的处理包括三类,分别为
传递——dispatchTouchEvent()函数、
拦截——onInterceptTouchEvent()函数、
消费——onTouchEvent()函数和OnTouchListener
2、传递流程
(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。
(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。
(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。
(5) OnTouchListener优先于onTouchEvent()对事件进行消费。
上面的消费即表示相应函数返回值为true。
(1) View不处理事件流程图
(2) View处理事件流程图
16.Android系统提供了那些动画机制
答:
1.逐帧动画
逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理
2.补间动画
补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种
缺陷:补间动画是只能够作用在View上,它只能够实现移动、缩放、旋转和淡入淡出这四种动画操作,补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性
逐帧动画和补间动画它们的技术已经比较老了,而且网上资料也非常多
3.属性动画
ValueAnimator
ValueAnimator是整个属性动画机制当中最核心的一个类
ObjectAnimator
相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性
17.java为什么跨平台
答:
因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码。然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。
18.Https与http
HTPPS和HTTP的概念
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
https协议需要到ca申请证书,一般免费证书很少,需要交费。http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全HTTPS解决的问题:1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机2 . 防止通讯过程中的数据的泄密和被窜改
19.Post与Get请求的区别
GET- 从指定的资源请求数据。
POST- 向指定的资源提交要被处理的数据
20.Java GC 原理
JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象
GC的工作目的很明确:在堆中,找到已经无用的对象,并把这些对象占用的空间收回使其可以重新利用.大多数垃圾回收的 算法思路都是一致的:把所有对象组成一个集合,或可以理解为树状结构,从树根开始找,只要可以找到的都是活动对象,如果找不到,应该被回收了。
21.移动端跨平台开发
Web 流:也被称为 Hybrid 技术,它基于 Web 相关技术来实现界面及功能:PhoneGap
虚拟机流:通过将某个语言的虚拟机移植到不同平台上来运行 Android
代码转换流:将某个语言转成 Objective-C、Java 或 C#,然后使用不同平台下的官方工具来开发
未经许可不得转载,转载请注明zilianliuxue的blog,本人保留所有版权。