Android面试常问的技术问题

面试时技术经理会问你一些工作中遇到的Android方面的问题。谈谈你所做的项目,和在项目中所扮演的角色。

很多其它内容请參考我的博客:点击打开链接

1.怎样优化ListView?

①Item布局,层级越少越好,使用hierarchyview工具查看优化。

②复用convertView点击打开链接

③使用ViewHolder

④item中有图片时。异步载入

⑤高速滑动时,不载入图片

⑥item中有图片时。应对图片进行适当压缩

⑦实现数据的分页载入



2.对于Android 的安全问题?

①错误导出组件

② 參数校验不严

③WebView引入各种安全问题,webview中的js注入

④不混淆、不防二次打包

⑤明文存储关键信息

⑦ 错误使用HTTPS



3. 怎样缩减APK包大小?代码

保持良好的编程习惯,不要反复或者不用的代码,慎重加入libs。移除使用不到的libs。

使用proguard混淆代码,它会对不用的代码做优化,而且混淆后也可以降低安装包的大小。

native code的部分,大多数情况下仅仅须要支持armabi与x86的架构就可以。假设非必须,可以考虑拿掉x86的部分。资源

使用Lint工具查找没有使用到的资源。去除不使用的图片,String,XML等等。 assets文件夹下的资源请确保没实用不上的文件。生成APK的时候,aapt工具本身会对png做优化。可是在此之前还能够使用其它工具如tinypng对图片进行进一步的压缩预处理。jpeg还是png,依据须要做选择,在某些时候jpeg能够降低图片的体积。 对于9.png的图片。可拉伸区域尽量切小,另外能够通过使用9.png拉伸达到大图效果的时候尽量不要使用整张大图。策略有选择性的提供hdpi,xhdpi,xxhdpi的图片资源。建议优先提供xhdpi的图片。对于mdpi,ldpi与xxxhdpi依据须要提供有差异的部分就可以。尽可能的重用已有的图片资源。比如对称的图片,仅仅须要提供一张,另外一张图片能够通过代码旋转的方式实现。能用代码绘制实现的功能。尽量不要使用大量的图片。比如降低使用多张图片组成animate-list的AnimationDrawable,这样的方式提供了多张图片非常占空间。



4.Android与server交互的方式中的对称加密和非对称加密是什么?

对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据能够用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。



5.设备横竖屏切换的时候,接下来会发生什么?

1、不设置Activity的android:configChanges时。切屏会又一次调用各个生命周期,切横屏时会运行一次,切竖屏时会运行两次

2、设置Activity的android:configChanges=”orientation”时。切屏还是会又一次调用各个生命周期,切横、竖屏时仅仅会运行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会又一次调用各个生命周期,仅仅会运行onConfigurationChanged方法



6.Android启动Service的两种方式是什么? 它们的适用情况是什么?

假设后台服务開始后基本能够独立执行的话,能够用startService。音乐播放器就能够这样用。它们会一直执行直到你调用 stopSelf或者stopService。你能够通过发送Intent或者接收Intent来与正在执行的后台服务通信,但大部分时间,你仅仅是启动服务并让它独立执行。

假设你须要与后台服务通过一个持续的连接来比較频繁地通信,建议使用bind()。比方你须要定位服务不停地把更新后的地理位置传给UI。Binder比Intent开发起来复杂一些,但假设真的须要。你也仅仅能使用它。

startService:生命周期与调用者不同。

启动后若调用者未调用stopService而直接退出,Service仍会执行

bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy



7.谈谈你对Android中Context的理解?

Context:包括上下文信息(外部值) 的一个參数. Android 中的 Context 分三种,Application Context ,Activity Context ,Service Context.

它描写叙述的是一个应用程序环境的信息。通过它我们能够获取应用程序的资源和类,也包含一些应用级别操作,比如:启动一个Activity,发送广播,接受Intent信息等



8.Service的onCreate回调在UI线程中吗?

Service生命周期的各个回调和其它的应用组件一样,是跑在主线程中。会影响到你的UI操作或者堵塞主线程中的其它事情



9.请介绍下AsyncTask的内部实现。适用的场景是?

AsyncTask内部也是Handler机制来完毕的,仅仅只是Android提供了运行框架来提供线程池来运行对应地任务,由于线程池的大小问题,所以AsyncTask仅仅应该用来运行耗时时间较短的任务,比方HTTP请求。大规模的下载和数据库的更改不适用于AsyncTask,由于会导致线程池阻塞,没有线程来运行其它的任务,导致的情形是会发生AsyncTask根本运行不了的问题

參考我的博客:点击打开链接



10.谈谈你对binder机制的理解?

binder是一种IPC机制,进程间通讯的一种工具.

Java层能够利用aidl工具来实现对应的接口.



11.Android中进程间通信有哪些实现方式?

Intent,Binder(AIDL)。Messenger。BroadcastReceiver



12.介绍下实现一个自己定义view的基本流程

1、自己定义View的属性 编写attr.xml文件

2、在layout布局文件里引用。同一时候引用命名空间

3、在View的构造方法中获得我们自己定义的属性 。在自己定义控件中进行读取(构造方法拿到attr.xml文件值)

4、重写onMesure

5、重写onDraw



13.Android中touch事件的传递机制是如何的?

1.Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent

2.Touch事件相关的类有View、ViewGroup、Activity

3.Touch事件会被封装成MotionEvent对象。该对象封装了手势按下、移动、松开等动作

4.Touch事件通常从Activity#dispatchTouchEvent发出,仅仅要没有被消费,会一直往下传递,到最底层的View。

5.假设Touch事件传递到的每一个View都不消费事件,那么Touch事件会反向向上传递,终于交由Activity#onTouchEvent处理.

6.onInterceptTouchEvent为ViewGroup特有,能够拦截事件.

7.Down事件到来时。假设一个View没有消费该事件,那么兴许的MOVE/UP事件都不会再给它



14.Android多线程的实现方式有哪些?

Thread & AsyncTask

Thread 能够与Loop 和 Handler 共用建立消息处理队列

AsyncTask 能够作为线程池并行处理多任务



15.Android开发中何时使用多进程?使用多进程的优点是什么?

要想知道怎样使用多进程,先要知道Android里的多进程概念。普通情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。

我们知道进程是系统分配资源和调度的基本单位,所以每一个进程都有自己独立的资源和内存空间,别的进程是不能随意訪问其它进程的内存和资源的。



1.那怎样让自己的应用拥有多个进程?

非常easy,我们的四大组件在AndroidManifest文件里注冊的时候。有个属性是android:process,1.这里能够指定组件的所处的进程。默认就是应用的主进程。

指定为别的进程之后,系统在启动这个组件的时候,就先创建(假设还没创建的话)这个进程,然后再创建该组件。

你能够重载Application类的onCreate方法,打印出它的进程名称,就能够清楚的看见了。

再设置android:process属性时候,有个地方须要注意:假设是android:process=”:deamon”,以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自己主动加上包名。而全局进程则不会。一般我们都是有私有进程。非常少使用全局进程。他们的详细差别不知道有没有谁能补充一下。



2.使用多进程显而易见的优点就是分担主进程的内存压力。

我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。

当然还有其它优点,有心人会发现Android后台进程里有非常多应用是多个进程的。由于它们要常驻后台,特别是即时通讯或者社交应用,只是如今多进程已经被用烂了。典型使用方法是在启动一个不可见的轻量级私有进程。在后台收发消息。或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程。守护进程和主进程之间相互监视,有一方被杀就又一次启动它。应该还有还有其它优点,这里就不多说了。



3.坏处的话,多占用了系统的空间,大家都这么用的话系统内存非常easy占满而导致卡顿。

消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。



16.ANR是什么?如何避免和解决ANR?

ANR:Application Not Responding,即应用无响应

ANR一般有三种类型:

1:KeyDispatchTimeout(5 seconds) –主要类型

按键或触摸事件在特定时间内无响应



2:BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完毕



3:ServiceTimeout(20 seconds) –小概率类型

Service在特定的时间内无法处理完毕超时的原因一般有两种:

(1)当前的事件没有机会得到处理(UI线程正在处理前一个事件没有及时完毕或者looper被某种原因堵塞住)

(2)当前的事件正在处理,但没有及时完毕



UI线程尽量仅仅做跟UI相关的工作,耗时的工作(数据库操作,I/O。连接网络或者其它可能阻碍UI线程的操作)放入单独的线程处理,尽量用Handler来处理UI thread和thread之间的交互。



UI线程主要包含例如以下:

Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()

AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()

Mainthread handler: handleMessage(), post(runnable r)

other



17.Android下解决滑动冲突的常见思路是什么?

相关的滑动组件 重写onInterceptTouchEvent,然后推断依据xy值,来决定是否要拦截当前操作



18.怎样把一个应用设置为系统应用?

成为系统应用。首先要在 相应设备的 Android 源代码 SDK 下编译,编译好之后:

此 Android 设备是 Debug 版本号,而且已经 root,直接将此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下就可以。假设非 root 设备,须要编译后又一次烧写设备镜像就可以。

有些权限(如 WRITE_SECURE_SETTINGS ),是不开放给第三方应用的,仅仅能在相应设备源代码中编译然后作为系统 app 使用。



19、Android内存泄露研究

Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,可是它们却能够直接或间接地引用到gc roots导致无法被GC回收。没用的对象占领着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。

场景类的静态变量持有大数据对象

静态变量长期维持到大数据对象的引用。阻止垃圾回收。

非静态内部类的静态实例

非静态内部类会维持一个到外部类实例的引用。假设非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。



资源对象未关闭

资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。

注冊对象未反注冊

未反注冊会导致观察者列表里维持着对象的引用,阻止垃圾回收。

Handler暂时性内存泄露

Handler通过发送Message与主线程交互。Message发出之后是存储在MessageQueue中的,有些Message也不是立即就被处理的。

在Message中存在一个 target,是Handler的一个引用,假设Message在Queue中存在的时间越长,就会导致Handler无法被回收。假设Handler是非静态的,则会导致Activity或者Service不会被回收。

因为AsyncTask内部也是Handler机制。相同存在内存泄漏的风险。

此种内存泄露。通常是暂时性的。

20.内存泄露检測有什么好方法?

检測:

1、DDMS Heap发现内存泄露

dataObject totalSize的大小,是否稳定在一个范围内。假设操作程序,不断添加,说明内存泄露

2、使用Heap Tool进行内存快照前后对照

BlankActivity手动触发GC进行前后对照。对象是否被及时回收



定位:

1、MAT插件打开.hprof详细定位内存泄露:

查看histogram项。选中某一个对象,查看它的GC引用链,由于存在GC引用链的,说明无法回收

2、AndroidStudio的Allocation Tracker:

观測到期间的内存分配,哪些对象被创建。什么时候创建。从而准确定位



21:多进程应该能为我们带来什么呢



  android平台相应用都有内存限制,事实上这个理解有点问题,应该是说android平台对每一个进程有内存限制,比方某机型对对进程限制是24m。假设应用有两个进程。则该应该的总内存限制是2*24m。使用多进程就能够使得我们一个apk所使用的内存限制加大几倍。所以能够借此图片平台相应用的内存限制,比方一些要对图片、视频、大文件进程处理的好内存的应用能够考虑用多进程来解决应用操作不流畅问题。

上一篇:C#窗体加载和控件加载不同步导致控件闪烁


下一篇:常问的MySQL面试题整理