技術(shù)面Q&A

[TOC]
建議就是在面一家公司之前了解好這個公司的app是以什么為驅(qū)動的,例如電商的話肯定要了解hybrid 開發(fā)的一些知識點(diǎn),圖像處理的公司要好好復(fù)習(xí)下bitmap canvas相關(guān)的知識點(diǎn),祝好運(yùn)!

UI:

1.View的繪制

Android視圖繪制流程完全解析,帶你一步步深入了解View(二)

2. Android自定義View的實(shí)現(xiàn)方法**

3.canvas

Andriod中繪(畫)圖----Canvas的使用詳解

Activity:

1.onPause和onStop的區(qū)別

onPause():Activity失去焦點(diǎn),但仍然可見。
onStop():Activity在后臺,不可見(完全被另一個Activity擋住,或者程序后臺運(yùn)行)。
1.全屏/鎖屏的時候,會依次調(diào)用onPause()和onStop()。
2.Toast、Dialog、Menu,三者都不會使Activity調(diào)用onPause()和onStop() 。
3.一個非全屏的Activity在前面時,后面的Activity只調(diào)用onPause(),不會調(diào)用onStop()。

2.Activity用的啟動方式

standard: 標(biāo)準(zhǔn)模式:一調(diào)用startActivity()方法就會產(chǎn)生一個新的實(shí)例。
singleTop: 如果已經(jīng)有一個實(shí)例位于Activity棧的頂部時,就不產(chǎn)生新的實(shí)例,而只是調(diào)用Activity中的newInstance()方法。如果不位于棧頂,會產(chǎn)生一個新的實(shí)例。
singleTask: 會在一個新的task中產(chǎn)生這個實(shí)例,以后每次調(diào)用都會使用這個,不會去產(chǎn)生新的實(shí)例了。
singleInstance: 這個跟singleTask基本上是一樣,只有一個區(qū)別:在這個模式下的Activity實(shí)例所處的task中,只能有這個activity實(shí)例,不能有其他的實(shí)例。

3.ActivityManagerService

第6章 深入理解ActivityManagerService**

4.activity的啟動過程:

深入理解Activity啟動流程(一)**

5.Activity之間的協(xié)作當(dāng)一個activity A啟動了另外一個activity B,它們的生命周期是有交叉的;

首先A的onPause()被調(diào)用;

e之后B的onCrate(), onStart()及onResume() 方法會被調(diào)用(此時B擁有用戶焦點(diǎn));

最后,如果A在屏幕上不可見,onStop()方法被調(diào)用;

因此,我們在兩個activities中傳遞數(shù)據(jù),或者共享資源時(如數(shù)據(jù)庫連接),需要在前一個activity的onPause()方法而不是onStop()方法中進(jìn)行;

Service

1.service解析

Android 中的 Service 全面總結(jié)**

2.兩種啟動方式

Service 兩種啟動方式**

Fragment

1.Fragment生命周期圖

image.png

2.Fragment與Activity生命周期對比圖

image.png

3.Fragment生命周期分析

  1. 當(dāng)一個fragment被創(chuàng)建的時候,它會經(jīng)歷以下狀態(tài).
    onAttach()
    onCreate()
    onCreateView()
    onActivityCreated()
  2. 當(dāng)這個fragment對用戶可見的時候,它會經(jīng)歷以下狀態(tài)。
    onStart()
    onResume()
  3. 當(dāng)這個fragment進(jìn)入“后臺模式”的時候,它會經(jīng)歷以下狀態(tài)。
    onPause()
    onStop()
  4. 當(dāng)這個fragment被銷毀了(或者持有它的activity被銷毀了),它會經(jīng)歷以下狀態(tài)。
    onPause()
    onStop()
    onDestroyView()
    onDestroy() // 本來漏掉類這個回調(diào),感謝xiangxue336提出。
    onDetach()
  5. 就像activitie一樣,在以下的狀態(tài)中,可以使用Bundle對象保存一個fragment的對象。
    onCreate()
    onCreateView()
    onActivityCreated()
  6. fragments的大部分狀態(tài)都和activitie很相似,但fragment有一些新的狀態(tài)。
    onAttached() —— 當(dāng)fragment被加入到activity時調(diào)用(在這個方法中可以獲得所在的activity)。
    onCreateView() —— 當(dāng)activity要得到fragment的layout時,調(diào)用此方法,fragment在其中創(chuàng)建自己的layout(界面)。
    onActivityCreated() —— 當(dāng)activity的onCreated()方法返回后調(diào)用此方法
    onDestroyView() —— 當(dāng)fragment中的視圖被移除的時候,調(diào)用這個方法。
    onDetach() —— 當(dāng)fragment和activity分離的時候,調(diào)用這個方法。

一旦activity進(jìn)入resumed狀態(tài)(也就是running狀態(tài)),你就可以自由地添加和刪除fragment了。因此,只有當(dāng)activity在resumed狀態(tài)時,fragment的生命周期才能獨(dú)立的運(yùn)轉(zhuǎn),其它時候是依賴于activity的生命周期變化的。

contentprovider數(shù)據(jù)存儲:

1.ContentProvider和Uri詳解**

2.sqlite

Android SQLite數(shù)據(jù)庫操作實(shí)例**

3.內(nèi)存泄露:

Android中使用Handler造成內(nèi)存泄露的分析和解決**
android開發(fā)中,可能會導(dǎo)致內(nèi)存泄露的問題**

1.不要讓生命周期長于Activity的對象持有到Activity的引用.
2.盡量使用Application的Context而不是Activity的Context.
3.盡量不要在Activity中使用非靜態(tài)內(nèi)部類,因?yàn)榉庆o態(tài)內(nèi)部類會隱式持有外部類實(shí)例的引用(具體可以查看細(xì)話Java:”失效”的private修飾符了解)。如果使用靜態(tài)內(nèi)部類,將外部實(shí)例引用作為弱引用持有。
4.垃圾回收不能解決內(nèi)存泄露,了解Android中垃圾回收機(jī)制.

網(wǎng)絡(luò)

1.volley

Android庫Volley的使用介紹**
Android Volley完全解析(四),帶你從源碼的角度理解Volley**

2.如何控制TCP連接時的擁塞

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

3.三次握手

首先Client端發(fā)送連接請求報文,Server段接受連接后回復(fù)ACK報文,并為這次連接分配資源。Client端接收到ACK報文后也向Server段發(fā)生ACK報文,并分配資源,這樣TCP連接就建立了。


image.png

4.四次揮手

Client端發(fā)起中斷連接請求,也就是發(fā)送FIN報文。Server端接到FIN報文后,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK,"告訴Client端,你的請求我收到了,但是我還沒準(zhǔn)備好,請繼續(xù)你等我的消息"。這個時候Client端就進(jìn)入FIN_WAIT狀態(tài),繼續(xù)等待Server端的FIN報文。當(dāng)Server端確定數(shù)據(jù)已發(fā)送完成,則向Client端發(fā)送FIN報文,"告訴Client端,好了,我這邊數(shù)據(jù)發(fā)完了,準(zhǔn)備好關(guān)閉連接了"。Client端收到FIN報文后,"就知道可以關(guān)閉連接了,但是他還是不相信網(wǎng)絡(luò),怕Server端不知道要關(guān)閉,所以發(fā)送ACK后進(jìn)入TIME_WAIT狀態(tài),如果Server端沒有收到ACK則可以重傳?!?,Server端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,我Client端也可以關(guān)閉連接了。Ok,TCP連接就這樣關(guān)閉了!


image.png

5.為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手?

因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的,SYN報文是用來同步的。但是關(guān)閉連接時,當(dāng)Server端收到FIN報文時,很可能并不會立即關(guān)閉SOCKET,所以只能先回復(fù)一個ACK報文,告訴Client端,"你發(fā)的FIN報文我收到了"。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文,因此不能一起發(fā)送。故需要四步握手。

6.為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報文段生存時間)才能返回到CLOSE狀態(tài)?

雖然按道理,四個報文都發(fā)送完畢,我們可以直接進(jìn)入CLOSE狀態(tài)了,但是我們必須假象網(wǎng)絡(luò)是不可靠的,有可以最后一個ACK丟失。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報文。

7. Android客戶端和服務(wù)端如何使用Token和Session

Android客戶端和服務(wù)端如何使用Token和Session**

8. 移動端獲取網(wǎng)絡(luò)數(shù)據(jù)優(yōu)化的幾個點(diǎn)

  1. 連接復(fù)用 :
    節(jié)省連接建立時間,如開啟 keep-alive。
    對于 Android 來說默認(rèn)情況下 HttpURLConnection 和 HttpClient 都開啟了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影響連接池的 Bug,具體可見:Android HttpURLConnection 及 HttpClient 選擇**
    請求合并:
    即將多個請求合并為一個進(jìn)行請求,比較常見的就是網(wǎng)頁中的 CSS Image Sprites。如果某個頁面內(nèi)請求過多,也可以考慮做一定的請求合并。
  2. 減少請求數(shù)據(jù)的大小:
    對于post請求,body可以做gzip壓縮的,header也可以作數(shù)據(jù)壓縮(不過只支持http 2.0)。
  3. 返回的數(shù)據(jù)的body也可以作gzip壓縮,body數(shù)據(jù)體積可以縮小到原來的30%左右。(也可以考慮壓縮返回的json數(shù)據(jù)的key數(shù)據(jù)的體積,尤其是針對返回數(shù)據(jù)格式變化不大的情況,支付寶聊天返回的數(shù)據(jù)用到了)
  4. 根據(jù)用戶的當(dāng)前的網(wǎng)絡(luò)質(zhì)量來判斷下載什么質(zhì)量的圖片(電商用的比較多)

圖像處理:

1.裁剪

2.Fresco:

Fresco | Fresco 中文說明**

android緩存

1.LRUCache

GC:

1.GC過程:

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

內(nèi)存:

1.內(nèi)存分配:

JVM內(nèi)存管理------JAVA語言的內(nèi)存管理概述**

多線程

1.線程池:

Java并發(fā)編程:線程池的使用**

事件分發(fā)機(jī)制

1.Android 中 Touch 事件的分發(fā)和消費(fèi)機(jī)制

算法:

1.TopK堆解決

Java最小堆解決TopK問題**

2.遞歸函數(shù)理解

遞歸函數(shù)即自調(diào)用函數(shù),在函數(shù)體內(nèi)部直接或間接地自己調(diào)用自己,即函數(shù)的嵌套調(diào)用是函數(shù)本身。

3.數(shù)組和鏈表的區(qū)別

二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
從邏輯結(jié)構(gòu)來看

  1. 數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時,可能超出原先定義的元素個數(shù);當(dāng)數(shù)據(jù)減少時,造成內(nèi)存浪費(fèi);數(shù)組可以根據(jù)下標(biāo)直接存取。
  2. 鏈表動態(tài)地進(jìn)行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項(xiàng)。(數(shù)組中插入、刪除數(shù)據(jù)項(xiàng)時,需要移動其它數(shù)據(jù)項(xiàng),非常繁瑣)鏈表必須根據(jù)next指針找到下一個元素
    從內(nèi)存存儲來看
  3. (靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但是自由度小
  4. 鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩
    從上面的比較可以看出,如果需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組;相反, 如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。

優(yōu)化

1.Listview的優(yōu)化

listview - Android**

2.convertView是如何傳遞到adapter的getView方法的

ListView性能優(yōu)化系列之三**

Hybrid

1.java和JS的交互

Android中Java和JavaScript交互**
Android中JavaScript和Native之間的Bridge**
WebView開啟JavaScript腳本執(zhí)行

WebView設(shè)置供JavaScript調(diào)用的交互接口。

客戶端和網(wǎng)頁端編寫調(diào)用對方的代碼。


什么是嵌入式實(shí)時操作系統(tǒng)?Android操作系統(tǒng)屬于實(shí)時操作系統(tǒng)么?

嵌入式實(shí)時操作系統(tǒng)是指當(dāng)外界時間或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能夠在規(guī)定的時間內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)做出快速響應(yīng)并控制所有實(shí)時任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。
屬于,屬于其中的軟實(shí)時。

Android程序運(yùn)行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別

運(yùn)行時權(quán)限是Dalvik授權(quán)(Android授權(quán))。
文件系統(tǒng)權(quán)限是Linux內(nèi)核授權(quán)。

DDMS和TraceView的區(qū)別

DDMS是Android開發(fā)環(huán)境中的Dalvik虛擬機(jī)調(diào)試監(jiān)控服務(wù)。

TraceView是Android平臺配備的性能分析的工具。
DDMS是一個程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器。

什么情況會導(dǎo)致Force Close?如何避免?能否捕獲導(dǎo)致其的異常?

拋出運(yùn)行時異常會導(dǎo)致Force Close,比如空指針、數(shù)組越界、類型轉(zhuǎn)換異常等。
在編寫程序時對可能出現(xiàn)異常的位置做相應(yīng)的處理,增強(qiáng)程序的健壯性。
可以通過logcat查看拋出異常代碼的位置,然后到程序中進(jìn)行修改。

activity的數(shù)據(jù)存儲的方式

SharedPreference
文件
網(wǎng)絡(luò)
SQLite數(shù)據(jù)庫
contentProvider

android中service的實(shí)現(xiàn)方法

startService和bindService

在android中,簡述JNI的調(diào)用過程

安裝和下載Cygwin,下載AndroidNDK
在NDK項(xiàng)目中進(jìn)行JNI接口的設(shè)計
使用C/C++實(shí)現(xiàn)本地方法
JNI生成動態(tài)鏈接庫.so文件
將動態(tài)鏈接復(fù)制到j(luò)ava工程,在java工程中調(diào)用,運(yùn)行java工程即可。

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

EF是基本文件,既有文件頭,也有文件體,文件頭存儲該文件的位置和控制信息,文件體存放真正的數(shù)據(jù),整個SIM卡中只有基本文件有文件體,也只有基本文件用來存儲數(shù)據(jù)。

簡述NDK是什么?

NDK是Native Develipment Kit,一個讓開發(fā)人員在android應(yīng)用中嵌入使用本地代碼編寫的組建的工具集。

android應(yīng)用程序結(jié)構(gòu)是那些?

android應(yīng)用程序?qū)?,?yīng)用程序框架層,系統(tǒng)運(yùn)行庫層,Linux核心層。

系統(tǒng)安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?

可以。
通過發(fā)送顯式Intent,啟動指定瀏覽器;
通過發(fā)送uri把參數(shù)帶過去,或者通過Manifest里的IntentFilter里的data屬性,訪問指定頁面。

java中如何引用本地語言?

可以使用JNI接口

頁面上現(xiàn)有ProgressBar控件progressBar,請用書寫線程以10秒的時間完成其進(jìn)度顯示工作。

handler機(jī)制的原理

android的IPC(進(jìn)程間通信)機(jī)制

嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有什么特性?

一條最長的短信息約占多少byte?

java.io包中什么類主要用于對對象(Object)的讀寫

url經(jīng)歷哪些過程

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

tcp中的3次握手


get和post的區(qū)別

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

TCP和UDP的區(qū)別

1.基于連接與無連接
2.TCP要求系統(tǒng)資源較多,UDP較少;
3.UDP程序結(jié)構(gòu)較簡單
4.流模式(TCP)與數(shù)據(jù)報模式(UDP);
5.TCP保證數(shù)據(jù)正確性,UDP可能丟包
6.TCP保證數(shù)據(jù)順序,UDP不保證
http://blog.csdn.net/li_ning_/article/details/52117463

TCP/IP五層模型的協(xié)議

應(yīng)用層
傳輸層:四層交換機(jī)、也有工作在四層的路由器
網(wǎng)絡(luò)層:路由器、三層交換機(jī)
數(shù)據(jù)鏈路層:網(wǎng)橋(現(xiàn)已很少使用)、以太網(wǎng)交換機(jī)(二層交換機(jī))、網(wǎng)卡(其實(shí)網(wǎng)卡是一半工作在物理層、一半工作在數(shù)據(jù)鏈路層)
物理層:中繼器、集線器、還有我們通常說的雙絞線也工作在物理層

OSI七層模型

OSI七層模型
OSI七層模型

進(jìn)程與線程的區(qū)別

進(jìn)程和線程都是一個時間段的描述,是CPU工作時間段的描述。線程是進(jìn)程中的一部分,進(jìn)程包含多個線程在運(yùn)行。
進(jìn)程就是包換上下文切換的程序執(zhí)行時間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文。
線程是共享了進(jìn)程的上下文環(huán)境的更為細(xì)小的CPU時間段。
線程和進(jìn)程的區(qū)別:
子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個線程則共享數(shù)據(jù)空間,每個線程有自己的執(zhí)行堆棧和程序計數(shù)器為其執(zhí)行上下文。多線程主要是為了節(jié)約CPU時間,發(fā)揮利用,根據(jù)具體情況而定。線程的運(yùn)行中需要使用計算機(jī)的內(nèi)存資源和CPU。
線程與進(jìn)程的區(qū)別歸納:
a.地址空間和其它資源:進(jìn)程間相互獨(dú)立,同一進(jìn)程的各線程間共享。某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見。
b.通信:進(jìn)程間通信IPC,線程間可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來進(jìn)行通信——需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性。
c.調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多。
d.在多線程OS中,進(jìn)程不是一個可執(zhí)行的實(shí)體。

Android多線程-----同步鎖

同步機(jī)制關(guān)鍵字synchronized
對于java來說,最常用的同步機(jī)制就是synchronized關(guān)鍵字,他是一種基于語言的粗略鎖,能夠作用于對象、函數(shù)、class。每個對象都只有一個鎖,誰能夠拿到這個鎖誰就有訪問權(quán)限。當(dāng)synchronized作用于函數(shù)時,實(shí)際上鎖的也是對象,鎖定的對象就是該函數(shù)所在類的對象。而synchronized作用于class時則是鎖的這個Class類,并非具體對象。

ArrayList和LinkedList的區(qū)別

1.ArrayList是實(shí)現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
2.對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因?yàn)長inkedList要移動指針。
3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因?yàn)锳rrayList要移動數(shù)據(jù)。
http://pengcqu.iteye.com/blog/502676

hashmap和hashtable的區(qū)別

hashmap hashtable
線程不安全 線程安全
允許有null的鍵和值 不允許有null的鍵和值
效率高一點(diǎn) 效率稍低
方法不是Synchronize的要提供外同步 方法是是Synchronize的
有containsvalue和containsKey方法 有contains方法方法
HashMap 是Java1.2 引進(jìn)的Map interface 的一個實(shí)現(xiàn) Hashtable 繼承于Dictionary 類
HashMap是Hashtable的輕量級實(shí)現(xiàn) Hashtable 比HashMap 要舊

hashmap的底層實(shí)現(xiàn)

HashMap是基于hashing的原理,我們使用put(key, value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當(dāng)我們給put()方法傳遞鍵和值時,我們先對鍵調(diào)用hashCode()方法,返回的hashCode用于找到bucket位置來儲存Entry對象。
HashMap是在bucket中儲存鍵對象和值對象,作為Map.Entry。

當(dāng)兩個對象的hashcode相同會發(fā)生什么

因?yàn)閔ashcode相同,所以它們的bucket位置相同,‘碰撞’會發(fā)生。因?yàn)镠ashMap使用LinkedList存儲對象,這個Entry(包含有鍵值對的Map.Entry對象)會存儲在LinkedList中。

解決Hash沖突的幾種方法

開放地址法:
1.線性探測法:ThreadLocalMap
2.線性補(bǔ)償探測法
3.偽隨機(jī)探測
拉鏈法
拉鏈法 : hashmap
再散列(雙重散列,多重散列)
建立一個公共溢出區(qū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,155評論 25 708
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,818評論 11 349
  • 線程和進(jìn)程的區(qū)別是啥 詳見 http://www.itdecent.cn/p/04c3706521b5 線程切換如...
    MrWang915閱讀 1,226評論 0 2
  • 在你的目光里逍遙 文||與你相識 暮色蒼茫,我在你朦朧的目光里出現(xiàn) 你是城市里的溫暖,你是生命里的陪伴 把黑夜描摹...
    與你相識_40fa閱讀 228評論 2 4
  • 今日打卡97分鐘,還是要在碎片時間來讀,一口氣這樣感覺有點(diǎn)不太行。質(zhì)量不高,勉強(qiáng)完成。
    吟_f3da閱讀 169評論 0 0

友情鏈接更多精彩內(nèi)容