技术面Q&A

2017-09-09  本文已影响0人  Jacinth

[TOC]
建议就是在面一家公司之前了解好这个公司的app是以什么为驱动的,例如电商的话肯定要了解hybrid 开发的一些知识点,图像处理的公司要好好复习下bitmap canvas相关的知识点,祝好运!

UI:

1.View的绘制

Android视图绘制流程完全解析,带你一步步深入了解View(二)

2. Android自定义View的实现方法**

3.canvas

Andriod中绘(画)图----Canvas的使用详解

Activity:

1.onPause和onStop的区别

onPause():Activity失去焦点,但仍然可见。
onStop():Activity在后台,不可见(完全被另一个Activity挡住,或者程序后台运行)。
1.全屏/锁屏的时候,会依次调用onPause()和onStop()。
2.Toast、Dialog、Menu,三者都不会使Activity调用onPause()和onStop() 。
3.一个非全屏的Activity在前面时,后面的Activity只调用onPause(),不会调用onStop()。

2.Activity用的启动方式

standard: 标准模式:一调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

3.ActivityManagerService

第6章 深入理解ActivityManagerService**

4.activity的启动过程:

深入理解Activity启动流程(一)**

5.Activity之间的协作当一个activity A启动了另外一个activity B,它们的生命周期是有交叉的;

首先A的onPause()被调用;

e之后B的onCrate(), onStart()及onResume() 方法会被调用(此时B拥有用户焦点);

最后,如果A在屏幕上不可见,onStop()方法被调用;

因此,我们在两个activities中传递数据,或者共享资源时(如数据库连接),需要在前一个activity的onPause()方法而不是onStop()方法中进行;

Service

1.service解析

Android 中的 Service 全面总结**

2.两种启动方式

Service 两种启动方式**

Fragment

1.Fragment生命周期图

image.png

2.Fragment与Activity生命周期对比图

image.png

3.Fragment生命周期分析

  1. 当一个fragment被创建的时候,它会经历以下状态.
    onAttach()
    onCreate()
    onCreateView()
    onActivityCreated()
  2. 当这个fragment对用户可见的时候,它会经历以下状态。
    onStart()
    onResume()
  3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。
    onPause()
    onStop()
  4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。
    onPause()
    onStop()
    onDestroyView()
    onDestroy() // 本来漏掉类这个回调,感谢xiangxue336提出。
    onDetach()
  5. 就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。
    onCreate()
    onCreateView()
    onActivityCreated()
  6. fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。
    onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
    onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
    onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
    onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
    onDetach() —— 当fragment和activity分离的时候,调用这个方法。

一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。

contentprovider数据存储:

1.ContentProvider和Uri详解**

2.sqlite

Android SQLite数据库操作实例**

3.内存泄露:

Android中使用Handler造成内存泄露的分析和解决**
android开发中,可能会导致内存泄露的问题**

1.不要让生命周期长于Activity的对象持有到Activity的引用.
2.尽量使用Application的Context而不是Activity的Context.
3.尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。
4.垃圾回收不能解决内存泄露,了解Android中垃圾回收机制.

网络

1.volley

Android库Volley的使用介绍**
Android Volley完全解析(四),带你从源码的角度理解Volley**

2.如何控制TCP连接时的拥塞

TCP的流量控制和拥塞控制**

3.三次握手

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。


image.png

4.四次挥手

Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!


image.png

5.为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

6.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

7. Android客户端和服务端如何使用Token和Session

Android客户端和服务端如何使用Token和Session**

8. 移动端获取网络数据优化的几个点

  1. 连接复用 :
    节省连接建立时间,如开启 keep-alive。
    对于 Android 来说默认情况下 HttpURLConnection 和 HttpClient 都开启了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug,具体可见:Android HttpURLConnection 及 HttpClient 选择**
    请求合并:
    即将多个请求合并为一个进行请求,比较常见的就是网页中的 CSS Image Sprites。如果某个页面内请求过多,也可以考虑做一定的请求合并。
  2. 减少请求数据的大小:
    对于post请求,body可以做gzip压缩的,header也可以作数据压缩(不过只支持http 2.0)。
  3. 返回的数据的body也可以作gzip压缩,body数据体积可以缩小到原来的30%左右。(也可以考虑压缩返回的json数据的key数据的体积,尤其是针对返回数据格式变化不大的情况,支付宝聊天返回的数据用到了)
  4. 根据用户的当前的网络质量来判断下载什么质量的图片(电商用的比较多)

图像处理:

1.裁剪

2.Fresco:

Fresco | Fresco 中文说明**

android缓存

1.LRUCache

GC:

1.GC过程:

JVM垃圾回收(GC)原理**

内存:

1.内存分配:

JVM内存管理------JAVA语言的内存管理概述**

多线程

1.线程池:

Java并发编程:线程池的使用**

事件分发机制

1.Android 中 Touch 事件的分发和消费机制

算法:

1.TopK堆解决

Java最小堆解决TopK问题**

2.递归函数理解

递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。

3.数组和链表的区别

二者都属于一种数据结构
从逻辑结构来看

  1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
  2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素
    从内存存储来看
  3. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
  4. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦
    从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

优化

1.Listview的优化

listview - Android**

2.convertView是如何传递到adapter的getView方法的

ListView性能优化系列之三**

Hybrid

1.java和JS的交互

Android中Java和JavaScript交互**
Android中JavaScript和Native之间的Bridge**
WebView开启JavaScript脚本执行

WebView设置供JavaScript调用的交互接口。

客户端和网页端编写调用对方的代码。


什么是嵌入式实时操作系统?Android操作系统属于实时操作系统么?

嵌入式实时操作系统是指当外界时间或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能够在规定的时间内来控制生产过程或对处理系统做出快速响应并控制所有实时任务协调一致运行的嵌入式操作系统。
属于,属于其中的软实时。

Android程序运行时权限与文件系统权限的区别

运行时权限是Dalvik授权(Android授权)。
文件系统权限是Linux内核授权。

DDMS和TraceView的区别

DDMS是Android开发环境中的Dalvik虚拟机调试监控服务。

TraceView是Android平台配备的性能分析的工具。
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。

什么情况会导致Force Close?如何避免?能否捕获导致其的异常?

抛出运行时异常会导致Force Close,比如空指针、数组越界、类型转换异常等。
在编写程序时对可能出现异常的位置做相应的处理,增强程序的健壮性。
可以通过logcat查看抛出异常代码的位置,然后到程序中进行修改。

activity的数据存储的方式

SharedPreference
文件
网络
SQLite数据库
contentProvider

android中service的实现方法

startService和bindService

在android中,简述JNI的调用过程

安装和下载Cygwin,下载AndroidNDK
在NDK项目中进行JNI接口的设计
使用C/C++实现本地方法
JNI生成动态链接库.so文件
将动态链接复制到java工程,在java工程中调用,运行java工程即可。

SIM卡的EF文件有什么作用?

EF是基本文件,既有文件头,也有文件体,文件头存储该文件的位置和控制信息,文件体存放真正的数据,整个SIM卡中只有基本文件有文件体,也只有基本文件用来存储数据。

简述NDK是什么?

NDK是Native Develipment Kit,一个让开发人员在android应用中嵌入使用本地代码编写的组建的工具集。

android应用程序结构是那些?

android应用程序层,应用程序框架层,系统运行库层,Linux核心层。

系统安装了多种浏览器,能否指定某浏览器访问指定页面?

可以。
通过发送显式Intent,启动指定浏览器;
通过发送uri把参数带过去,或者通过Manifest里的IntentFilter里的data属性,访问指定页面。

java中如何引用本地语言?

可以使用JNI接口

页面上现有ProgressBar控件progressBar,请用书写线程以10秒的时间完成其进度显示工作。

handler机制的原理

android的IPC(进程间通信)机制

嵌入式操作系统内存管理有哪几种,各有什么特性?

一条最长的短信息约占多少byte?

java.io包中什么类主要用于对对象(Object)的读写

url经历哪些过程

http://www.cnblogs.com/keedor/p/4415874.html

tcp中的3次握手


get和post的区别

http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

TCP和UDP的区别

1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.流模式(TCP)与数据报模式(UDP);
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证
http://blog.csdn.net/li_ning_/article/details/52117463

TCP/IP五层模型的协议

应用层
传输层:四层交换机、也有工作在四层的路由器
网络层:路由器、三层交换机
数据链路层:网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层)
物理层:中继器、集线器、还有我们通常说的双绞线也工作在物理层

OSI七层模型

OSI七层模型OSI七层模型

进程与线程的区别

进程和线程都是一个时间段的描述,是CPU工作时间段的描述。线程是进程中的一部分,进程包含多个线程在运行。
进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文。
线程是共享了进程的上下文环境的更为细小的CPU时间段。
线程和进程的区别:
子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。
线程与进程的区别归纳:
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.调度和切换:线程上下文切换比进程上下文切换要快得多。
d.在多线程OS中,进程不是一个可执行的实体。

Android多线程-----同步锁

同步机制关键字synchronized
对于java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限。当synchronized作用于函数时,实际上锁的也是对象,锁定的对象就是该函数所在类的对象。而synchronized作用于class时则是锁的这个Class类,并非具体对象。

ArrayList和LinkedList的区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
http://pengcqu.iteye.com/blog/502676

hashmap和hashtable的区别

hashmap hashtable
线程不安全 线程安全
允许有null的键和值 不允许有null的键和值
效率高一点 效率稍低
方法不是Synchronize的要提供外同步 方法是是Synchronize的
有containsvalue和containsKey方法 有contains方法方法
HashMap 是Java1.2 引进的Map interface 的一个实现 Hashtable 继承于Dictionary 类
HashMap是Hashtable的轻量级实现 Hashtable 比HashMap 要旧

hashmap的底层实现

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
HashMap是在bucket中储存键对象和值对象,作为Map.Entry。

当两个对象的hashcode相同会发生什么

因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。

解决Hash冲突的几种方法

开放地址法:
1.线性探测法:ThreadLocalMap
2.线性补偿探测法
3.伪随机探测
拉链法
拉链法 : hashmap
再散列(双重散列,多重散列)
建立一个公共溢出区

上一篇下一篇

猜你喜欢

热点阅读