面试时技术经理会问你一些工作中遇到的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所使用的内存限制加大几倍。所以能够借此图片平台相应用的内存限制,比方一些要对图片、视频、大文件进程处理的好内存的应用能够考虑用多进程来解决应用操作不流畅问题。

Android面试常问的技术问题的更多相关文章

  1. Android面试常问到的知识点

    一.算法,数据结构 1.排序算法 2.查找算法 3.二叉树 4.广度,深度算法: 二.java基础 1.集合Collection,List,Map等常用方法,特点,关系: 2.线程的同步,中断方式有几 ...

  2. 面试常问的dubbo的spi机制到底是什么?

    前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...

  3. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

  4. python基础之面试常问

    目录 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法. lambda函数 高级函数 map.reduce.filter.sorted等. 简述六种基本 ...

  5. 月薪20k+的Android面试都问些什么?(含答案)

    金九银十跳槽季接近尾声了,可是今年由于疫情的影响仍然不太好找工作,相信大家肯定急需一套Android面试宝典,下面就分享给大家我珍藏已久的Android高阶面试宝典,供大家学习 ! 1.自定义Hand ...

  6. 各大互联网公司java开发面试常问问题

    本人是做java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些,相信面试会轻松许多. 1. junit用法,be ...

  7. Java面试常问的问题(转载)

    并发.JVM.分布式.TCP/IP协议 1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的.以下简单模拟一个数据结构的连环炮. ...

  8. 面试常问Spring IOC,不得不会。

    广义的 IOC IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”. 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 DI .DL 的关系( ...

  9. 确保安全的HTTPS(对HTTP加密的几种技术,前端面试常问)第一篇

    HTTP固然足够好,但是在安全方面有着很大隐患: 1.与服务器进行通信使用的是明文,内容可能会被窃听(HTTP协议本身并不具备加密功能,所以无法对请求和响应的内容进行加密) 2.使用HTTP协议的服务 ...

随机推荐

  1. [ CQOI 2009 ] 中位数图

    \(\\\) \(Description\) 给出\(N\)的一个全排列,统计该排列有多少个长度为奇数的连续子序列,中位数是\(B\). \(N\in [0,10^5]\),\(B\in [0,N]\ ...

  2. Html常用标签及全称

    <!-- 块标签 divsion --><div></div> <!--br 换行    break--> <br /> <!--分割 ...

  3. Node.js的运行

    nodejs的运行 首先要在你的电脑上下载node.js并安装,大家可以去官网下载 1.第一种方法:去官网下载git,安装好后,在桌面上单击鼠标右键,会有一个Git Bash Here,然后在新建一个 ...

  4. Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决

    一. 问题出现原因         我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...

  5. Serializable和Parcelable的简单介绍

    Serializable和Pacelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable. Seriali ...

  6. Java 基础入门随笔(1) JavaSE版——java语言三种技术架构

    1.java语言的三种技术架构: J2SE(java 2 Platform Standard Edition):标准版,是为开发普通桌面和商务应用程序提供的解决方案.该技术体系是其他两者的基础,可以完 ...

  7. 论文deadline 最后三天

    2015.12.29 星期二 内容整改 2015.12.30 星期三 参考文献,摘要等 2015.12.31 星期四 最后修改 尽最大的努力去做好论文的事情.

  8. C# 金钱添加逗号0000

    private void Form1_Load(object sender, EventArgs e) { decimal dd = (decimal)11234567890.01; string d ...

  9. C# Winform 获得下拉框 选中的值

    string PrintName = cmbPrinter.SelectedIndex.ToString(); PrintName = cmbPrinter.SelectedItem.ToString ...

  10. nginx+tomcat实现负载均衡集群

    一台tomcat站点由于可能出现单点故障及无法应付过多客户复杂多样的请求等问题,不能单独应用于生产环境下 所以需要一套可靠的解决方案来完善web站点架构 而Nginx只能访问静态页面,如果需要动态需要 ...