61. Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念
DVM指Dalvik的虛擬機(jī)。每一個Android應(yīng)用程序都在它自己的進(jìn)程中運行醉鳖,都擁有一個獨立的Dalvik虛擬機(jī)實例。而每一個DVM都是在Linux 中的一個進(jìn)程秉继,所以說可以認(rèn)為是同一個概念祈噪。
62. sim卡的EF 文件有何作用
sim卡的文件系統(tǒng)有自己規(guī)范,主要是為了和手機(jī)通訊尚辑,sim本身可以有自己的操作系統(tǒng)辑鲤,EF就是作存儲并和手機(jī)通訊用的
63. JDK和JRE的區(qū)別是什么?
Java運行時環(huán)境(JRE)是將要執(zhí)行Java程序的Java虛擬機(jī)杠茬。它同時也包含了執(zhí)行applet需要的瀏覽器插件遂填。Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了JRE澈蝙,編譯器和其他的工具(比如:JavaDoc吓坚,Java調(diào)試器),可以讓開發(fā)者開發(fā)灯荧、編譯礁击、執(zhí)行Java應(yīng)用程序。
64. 什么是死鎖(deadlock)逗载?
兩個進(jìn)程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖哆窿。結(jié)果就是兩個進(jìn)程都陷入了無限的等待中。
65. Java中的HashMap的工作原理是什么厉斟?
Java中的HashMap是以鍵值對(key-value)的形式存儲元素的挚躯。HashMap需要一個hash函數(shù),它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素擦秽。當(dāng)調(diào)用put()方法的時候码荔,HashMap會計算key的hash值,然后把鍵值對存儲在集合中合適的索引上感挥。如果key已經(jīng)存在了缩搅,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity)触幼,負(fù)載因子(load factor)和擴(kuò)容極限(threshold resizing)硼瓣。
66. hashCode()和equals()方法的重要性體現(xiàn)在什么地方?
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引置谦,當(dāng)根據(jù)鍵獲取值的時候也會用到這兩個方法堂鲤。如果沒有正確的實現(xiàn)這兩個方法,兩個不同的鍵可能會有相同的hash值媒峡,因此瘟栖,可能會被集合認(rèn)為是相等的。而且丝蹭,這兩個方法也用來發(fā)現(xiàn)重復(fù)元素慢宗。所以這兩個方法的實現(xiàn)對HashMap的精確性和正確性是至關(guān)重要的坪蚁。
67. 數(shù)組(Array)和列表(ArrayList)有什么區(qū)別?什么時候應(yīng)該使用Array而不是ArrayList镜沽?
Array可以包含基本類型和對象類型敏晤,ArrayList只能包含對象類型。
Array大小是固定的缅茉,ArrayList的大小是動態(tài)變化的嘴脾。
ArrayList提供了更多的方法和特性,比如:addAll()蔬墩,removeAll()译打,iterator()等等。
對于基本類型數(shù)據(jù),集合使用自動裝箱來減少編碼工作量。但是拢军,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時候,這種方式相對比較慢韵洋。
68. ArrayList和LinkedList有什么區(qū)別?
ArrayList和LinkedList都實現(xiàn)了List接口黄锤,他們有以下的不同點:
(1)ArrayList是基于索引的數(shù)據(jù)接口搪缨,它的底層是數(shù)組。它可以以O(shè)(1)時間復(fù)雜度對元素進(jìn)行隨機(jī)訪問鸵熟。與此對應(yīng)副编,LinkedList是以元素列表的形式存儲它的數(shù)據(jù),每一個元素都和它的前一個和后一個元素鏈接在一起流强,在這種情況下痹届,查找某個元素的時間復(fù)雜度是O(n)。
(2)相對于ArrayList煮盼,LinkedList的插入短纵,添加带污,刪除操作速度更快僵控,因為當(dāng)元素被添加到集合任意位置的時候,不需要像數(shù)組那樣重新計算大小或者是更新索引鱼冀。
(3)LinkedList比ArrayList更占內(nèi)存报破,因為LinkedList為每一個節(jié)點存儲了兩個引用,一個指向前一個元素千绪,一個指向下一個元素充易。
69. Comparable和Comparator接口是干什么的?列出它們的區(qū)別
Java提供了只包含一個compareTo()方法的Comparable接口荸型。這個方法可以個給兩個對象排序盹靴。具體來說,它返回負(fù)數(shù),0稿静,正數(shù)來表明輸入對象小于梭冠,等于,大于已經(jīng)存在的對象改备。
Java提供了包含compare()和equals()兩個方法的Comparator接口控漠。compare()方法用來給兩個輸入?yún)?shù)排序,返回負(fù)數(shù)悬钳,0盐捷,正數(shù)表明第一個參數(shù)是小于,等于默勾,大于第二個參數(shù)碉渡。equals()方法需要一個對象作為參數(shù),它用來決定輸入?yún)?shù)是否和comparator相等母剥。只有當(dāng)輸入?yún)?shù)也是一個comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時候爆价,這個方法才返回true。
70. HashSet和TreeSet有什么區(qū)別媳搪?
HashSet是由一個hash表來實現(xiàn)的铭段,因此,它的元素是無序的秦爆。add()序愚,remove(),contains()方法的時間復(fù)雜度是O(1)等限。
另一方面爸吮,TreeSet是由一個樹形的結(jié)構(gòu)來實現(xiàn)的,它里面的元素是有序的望门。因此形娇,add(),remove()筹误,contains()方法的時間復(fù)雜度是O(logn)桐早。
71. 如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的內(nèi)存厨剪?
不會哄酝,在下一個垃圾回收周期中,這個對象將是可被回收的祷膳。
72. Java支持多繼承么陶衅?
不支持,Java不支持多繼承直晨。每個類都只能繼承一個類搀军,但是可以實現(xiàn)多個接口膨俐。
73. 接口和抽象類的區(qū)別是什么?
Java提供和支持創(chuàng)建抽象類和接口罩句。它們的實現(xiàn)有共同點吟策,不同點在于:
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法的止。
類可以實現(xiàn)很多個接口檩坚,但是只能繼承一個抽象類
類如果要實現(xiàn)一個接口,它必須要實現(xiàn)接口聲明的所有方法诅福。但是匾委,類可以不實現(xiàn)抽象類聲明的所有方法,當(dāng)然氓润,在這種情況下赂乐,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口挨措。
Java接口中聲明的變量默認(rèn)都是final的崩溪。抽象類可以包含非final的變量伶唯。
Java接口中的成員函數(shù)默認(rèn)是public的。抽象類的成員函數(shù)可以是private瞪讼,protected或者是public符欠。
接口是絕對抽象的瓶埋,不可以被實例化希柿。抽象類也不可以被實例化,但是悬赏,如果它包含main方法的話是可以被調(diào)用的狡汉。
74. 什么是值傳遞和引用傳遞?
(1)對象被值傳遞闽颇,意味著傳遞了對象的一個副本。因此寄锐,就算是改變了對象副本兵多,也不會影響源對象的值尖啡。
(2)對象被引用傳遞,意味著傳遞的并不是實際的對象剩膘,而是對象的引用衅斩。因此,外部對引用對象所做的改變會反映到所有的對象上怠褐。
75. 進(jìn)程和線程的區(qū)別是什么
進(jìn)程是執(zhí)行著的應(yīng)用程序畏梆,而線程是進(jìn)程內(nèi)部的一個執(zhí)行序列。一個進(jìn)程可以有多個線程奈懒。線程又叫做輕量級進(jìn)程奠涌。
76. 創(chuàng)建線程有幾種不同的方式极祸?你喜歡哪一種浴捆?為什么?
有三種方式可以用來創(chuàng)建線程:
繼承Thread類
實現(xiàn)Runnable接口
應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池
實現(xiàn)Runnable接口這種方式更受歡迎滔金,因為這不需要繼承Thread類。在應(yīng)用設(shè)計中已經(jīng)繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承)蝌矛,只能實現(xiàn)接口隆豹。同時判哥,線程池也是非常高效的,很容易實現(xiàn)和使用锌仅。
77. 概括的解釋下線程的幾種可用狀態(tài)
線程在執(zhí)行過程中嫩痰,可以處于下面幾種狀態(tài):
就緒(Runnable):線程準(zhǔn)備運行丽旅,不一定立馬就能開始執(zhí)行。
運行中(Running):進(jìn)程正在執(zhí)行線程的代碼。
等待中(Waiting):線程處于阻塞的狀態(tài)米丘,等待外部的處理結(jié)束。
睡眠中(Sleeping):線程被強(qiáng)制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成稍算。
同步阻塞(Blocked on Synchronization):等待獲取鎖。
死亡(Dead):線程完成了執(zhí)行勃教。
78. 什么是迭代器(Iterator)汞贸?
Iterator接口提供了很多對集合元素進(jìn)行迭代的方法。每一個集合類都包含了可以返回迭代器實例的迭代方法多柑。迭代器可以在迭代的過程中刪除底層集合的元素。
79. 靜態(tài)內(nèi)部類初嘹、內(nèi)部類、匿名內(nèi)部類驻龟,為什么內(nèi)部類會持有外部類的引用?持有的引用是this?還是其它?
靜態(tài)內(nèi)部類:使用static修飾的內(nèi)部類
內(nèi)部類:就是在某個類的內(nèi)部又定義了一個類谴蔑,內(nèi)部類所嵌入的類稱為外部類匿名內(nèi)部類:使用new生成的內(nèi)部類因為內(nèi)部類的產(chǎn)生依賴于外部類,持有的引用是類名.this
80. equals與==的區(qū)別
==是判斷兩個變量或?qū)嵗遣皇侵赶蛲粋€內(nèi)存空間 equals是判斷兩個變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相
81. Java的四種引用的區(qū)別
強(qiáng)引用:如果一個對象具有強(qiáng)引用,它就不會被垃圾回收器回收荞怒。即使當(dāng)前內(nèi)存空間不足,JVM 也不會回收它呛踊,而是拋出 OutOfMemoryError 錯誤赃春,使程序異常終止。如果想中斷強(qiáng)引用和某個對象之間的關(guān)聯(lián)站楚,可以顯式地將引用賦值為null采盒,這樣一來的話尺栖,JVM在合適的時間就會回收該對象
軟引用:在使用軟引用時叉橱,如果內(nèi)存的空間足夠,軟引用就能繼續(xù)被使用抡句,而不會被垃圾回收器回收殴蹄,只有在內(nèi)存不足時绑嘹,軟引用才會被垃圾回收器回收。
弱引用:具有弱引用的對象擁有的生命周期更短暫工腋。因為當(dāng) JVM 進(jìn)行垃圾回收姨丈,一旦發(fā)現(xiàn)弱引用對象,無論當(dāng)前內(nèi)存空間是否充足擅腰,都會將弱引用回收蟋恬。不過由于垃圾回收器是一個優(yōu)先級較低的線程歼争,所以并不一定能迅速發(fā)現(xiàn)弱引用對象
虛引用:顧名思義蹋肮,就是形同虛設(shè),如果一個對象僅持有虛引用涯塔,那么它相當(dāng)于沒有引用践惑,在任何時候都可能被垃圾回收器回收携添。
82. 垃圾回收機(jī)制
標(biāo)記回收法:遍歷對象圖并且記錄可到達(dá)的對象矫限,以便刪除不可到達(dá)的對象栏豺,一般使用單線程工作并且可能產(chǎn)生內(nèi)存碎片
標(biāo)記-壓縮回收法:前期與第一種方法相同,只是多了一步班套,將所有的存活對象壓縮到內(nèi)存的一端蘸拔,這樣內(nèi)存碎片就可以合成一大塊可再利用的內(nèi)存區(qū)域褐耳,提高了內(nèi)存利用率
復(fù)制回收法:把現(xiàn)有內(nèi)存空間分成兩部分砰诵,gc運行時,它把可到達(dá)對象復(fù)制到另一半空間,再清空正在使用的空間的全部對象台丛。這種方法適用于短生存期的對象,持續(xù)復(fù)制長生存期的對象則導(dǎo)致效率降低饱须。
分代回收發(fā):把內(nèi)存空間分為兩個或者多個域,如年輕代和老年代玩荠,年輕代的特點是對象會很快被回收漆腌,因此在年輕代使用效率比較高的算法贼邓。當(dāng)一個對象經(jīng)過幾次回收后依然存活,對象就會被放入稱為老年的內(nèi)存空間闷尿,老年代則采取標(biāo)記-壓縮算法
83. 數(shù)組與鏈表區(qū)別
數(shù)組
數(shù)組存儲區(qū)間是連續(xù)的塑径,占用內(nèi)存嚴(yán)重,故空間復(fù)雜的很大填具。但數(shù)組的二分查找時間復(fù)雜度小统舀,為O(1);數(shù)組的特點是:尋址容易,插入和刪除困難;
鏈表
鏈表存儲區(qū)間離散劳景,占用內(nèi)存比較寬松誉简,故空間復(fù)雜度很小,但時間復(fù)雜度很大枢泰,達(dá)O(N)描融。鏈表的特點是:尋址困難,插入和刪除容易衡蚂。
84. 說說hashMap是怎樣實現(xiàn)的
哈希表:由數(shù)組+鏈表組成的
當(dāng)我們往HashMap中put元素的時候窿克,先根據(jù)key的hashCode重新計算hash值,根據(jù)hash值得到這個元素在數(shù)組中的位置(即下標(biāo))毛甲,如果數(shù)組該位置上已經(jīng)存放有其他元素了年叮,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭玻募,最先加入的放在鏈尾只损。如果數(shù)組該位置上沒有元素,就直接將該元素放到此數(shù)組中的該位置上七咧。
82. HashMap和 HashTable 的區(qū)別
HashTable比較老跃惫,是基于Dictionary 類實現(xiàn)的,HashTable 則是基于 Map接口實現(xiàn)的
HashTable 是線程安全的艾栋, HashMap 則是線程不安全的
HashMap可以讓你將空值作為一個表的條目的key或value
83. wait()和sleep()的區(qū)別
sleep來自Thread類爆存,和wait來自O(shè)bject類
調(diào)用sleep()方法的過程中,線程不會釋放對象鎖蝗砾。而 調(diào)用 wait 方法線程會釋放對象鎖
sleep睡眠后不出讓系統(tǒng)資源先较,wait讓出系統(tǒng)資源其他線程可以占用CPU
sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒
84. 若Activity已經(jīng)銷毀悼粮,此時AsynTask執(zhí)行完并且返回結(jié)果闲勺,會報異常嗎?
當(dāng)一個App旋轉(zhuǎn)時,整個Activity會被銷毀和重建扣猫。當(dāng)Activity重啟時菜循,AsyncTask中對該Activity的引用是無效的,因此onPostExecute()就不會起作用苞笨,若AsynTask正在執(zhí)行债朵,折會報 view not attached to window manager 異常
同樣也是生命周期的問題子眶,在 Activity 的onDestory()方法中調(diào)用Asyntask.cancal方法,讓二者的生命周期同步
85. TCP三次握手
TCP/IP協(xié)議高序芦,因為其擁有三次握手雙向機(jī)制臭杰,這一機(jī)制保證校驗了數(shù)據(jù),保證了他的可靠性谚中。
UDP就沒有了渴杆,udp信息發(fā)出后,不驗證是否到達(dá)對方,所以不可靠。
但是就速度來說宪塔,還是UDP協(xié)議更高磁奖,畢竟其無需重復(fù)返回驗證,只是一次性的
86. http協(xié)議了解多少某筐,說說里面的協(xié)議頭部有哪些字段?
http(超文本傳輸協(xié)議)是一個基于請求與響應(yīng)模式的比搭、無狀態(tài)的、應(yīng)用層的協(xié)議;http請求由三部分組成南誊,分別是:請求行身诺、消息報頭、請求正文抄囚。
HTTP消息報頭包括普通報頭霉赡、請求報頭、響應(yīng)報頭幔托、實體報頭
87. https了解多少
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)穴亏,是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版重挑。即HTTP下加入SSL層嗓化,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL谬哀。
88. 談?wù)?HTTP 中Get 和 Post 方法的區(qū)別
GET - 從指定的服務(wù)器中獲取數(shù)據(jù)蟆湖,明文發(fā)送內(nèi)容
POST - 提交數(shù)據(jù)給指定的服務(wù)器處理
- POST請求不能被緩存下來
- POST請求不會保存在瀏覽器瀏覽記錄中
- 以POST請求的URL無法保存為瀏覽器書簽
- POST請求沒有長度限制
89. Fragment 如何實現(xiàn)類似 Activity 棧的壓棧和出棧效果的?
Fragment 的事物管理器內(nèi)部維持了一個雙向鏈表結(jié)構(gòu),該結(jié)構(gòu)可以記錄我們每次 add 的
Fragment 和 replace 的 Fragment玻粪,然后當(dāng)我們點擊 back 按鈕的時候會自動幫我們實現(xiàn)退棧操作。
90. Fragment 在你們項目中的使用
Fragment 是 android3.0 以后引入的的概念诬垂,做局部內(nèi)容更新更方便劲室,原來為了到達(dá)這一點要把多個布局放到一個 activity 里面,現(xiàn)在可以用多 Fragment 來代替结窘,只有在需要的時候才加載Fragment很洋,提高性能。
Fragment 的好處:
- Fragment 可以使你能夠?qū)?activity 分離成多個可重用的組件隧枫,每個都有它自己的生命周期和UI喉磁。
- Fragment 可以輕松得創(chuàng)建動態(tài)靈活的 UI 設(shè)計谓苟,可以適應(yīng)于不同的屏幕尺寸。從手機(jī)到平板電腦协怒。
- Fragment 是一個獨立的模塊,緊緊地與 activity 綁定在一起涝焙。可以運行中動態(tài)地移除孕暇、加入仑撞、交換等。
- Fragment 提供一個新的方式讓你在不同的安卓設(shè)備上統(tǒng)一你的 UI妖滔。
- Fragment 解決 Activity 間的切換不流暢隧哮,輕量切換。
- Fragment 替代 TabActivity 做導(dǎo)航座舍,性能更好沮翔。
- Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能夠生成更好的界面效果
91. 如何切換 fragement,不重新實例化
正確的切換方式是 add()曲秉,切換時 hide()采蚀,add()另一個 Fragment;再次切換時,只需 hide()當(dāng)前岸浑,show()另一個
92. 內(nèi)存不足時搏存,怎么保持Activity的一些狀態(tài),在哪個方法里面做具體操作?
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法矢洲,它們不同于 onCreate()璧眠、onPause()等生命周期方法,它們并不一定會被觸發(fā)读虏。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足责静、用戶直接按Home鍵)由系統(tǒng)銷毀一個Activity,onSaveInstanceState() 會被調(diào)用盖桥。但是當(dāng)用戶主動去銷毀一個Activity時灾螃,例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會被調(diào)用揩徊。除非該activity是被用戶主動銷毀的腰鬼,通常onSaveInstanceState()只適合用于保存一些臨時性的狀態(tài),而onPause()適合用于數(shù)據(jù)的持久化保存塑荒∠ㄉ模 onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之間調(diào)用。
93. Android中的Context, Activity齿税,Appliction有什么區(qū)別?
相同:Activity和Application都是Context的子類彼硫。
Context從字面上理解就是上下文的意思,在實際應(yīng)用中它也確實是起到了管理上下文環(huán)境中各個參數(shù)和變量的總用,方便我們可以簡單的訪問到各種資源拧篮。
不同:維護(hù)的生命周期不同词渤。 Context維護(hù)的是當(dāng)前的Activity的生命周期,Application維護(hù)的是整個項目的生命周期串绩。
使用context的時候缺虐,小心內(nèi)存泄露,防止內(nèi)存泄露赏参,注意一下幾個方面:
- 不要讓生命周期長的對象引用activity context志笼,即保證引用activity的對象要與activity本身生命周期是一樣的。
- 對于生命周期長的對象把篓,可以使用application纫溃,context。
- 避免非靜態(tài)的內(nèi)部類韧掩,盡量使用靜態(tài)類紊浩,避免生命周期問題,注意內(nèi)部類對外部對象引用導(dǎo)致的生命周期變化疗锐。
94. Context是什么?
它描述的是一個應(yīng)用程序環(huán)境的信息坊谁,即上下文。
該類是一個抽象(abstract class)類滑臊,Android提供了該抽象類的具體實現(xiàn)類(ContextIml)口芍。
通過它我們可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級別操作雇卷,例如:啟動一個Activity鬓椭,發(fā)送廣播,接受Intent关划,信息小染,等。
95. Service 是否在 main thread 中執(zhí)行, service 里面是否能執(zhí)行耗時的操
默認(rèn)情況,如果沒有顯示的指 servic 所運行的進(jìn)程, Service 和 activity 是運行在當(dāng)前 app 所在進(jìn)程的 main thread(UI 主線程)里面贮折。
service 里面不能執(zhí)行耗時的操作(網(wǎng)絡(luò)請求,拷貝數(shù)據(jù)庫,大文件 )
不管是application activity 還是service, 如果在主線程中寫了耗時操作,很容易引起ANR, 應(yīng)用程序無響應(yīng). 耗時操作應(yīng)該用子線程處理.
特殊情況 ,可以在清單文件配置 service 執(zhí)行所在的進(jìn)程 ,讓 service 在另外的進(jìn)程中執(zhí)行
96. 說說 Activity裤翩、Intent、Service 是什么關(guān)系
他們都是 Android 開發(fā)中使用頻率最高的類调榄。其中 Activity 和 Service 都是 Android 四大組件
之一踊赠。他倆都是 Context 類的子類 ContextWrapper 的子類,因此他倆可以算是兄弟關(guān)系吧每庆。不過
兄弟倆各有各自的本領(lǐng)臼疫,Activity 負(fù)責(zé)用戶界面的顯示和交互,Service 負(fù)責(zé)后臺任務(wù)的處理扣孟。Activity和 Service 之間可以通過 Intent 傳遞數(shù)據(jù),因此可以把 Intent 看作是通信使者荣赶。
97. 為什么要用 ContentProvider?它和 sql 的實現(xiàn)上有什么差別?
ContentProvider 屏蔽了數(shù)據(jù)存儲的細(xì)節(jié),內(nèi)部實現(xiàn)對用戶完全透明,用戶只需要關(guān)心操作數(shù)據(jù)的uri 就可以了凤价,ContentProvider 可以實現(xiàn)不同 app 之間共享鸽斟。
Sql 也有增刪改查的方法,但是 sql 只能查詢本應(yīng)用下的數(shù)據(jù)庫利诺。而 ContentProvider 還可以去增刪改查本地文件. xml 文件的讀取等富蓄。
98. 說說 ContentProvider、ContentResolver慢逾、ContentObserver 之間的關(guān)系
a. ContentProvider 內(nèi)容提供者立倍,用于對外提供數(shù)據(jù)
b. ContentResolver.notifyChange(uri)發(fā)出消息
c. ContentResolver 內(nèi)容解析者,用于獲取內(nèi)容提供者提供的數(shù)據(jù)
d. ContentObserver 內(nèi)容監(jiān)聽器侣滩,可以監(jiān)聽數(shù)據(jù)的改變狀態(tài)
e. ContentResolver.registerContentObserver()監(jiān)聽消息口注。
99. SurfaceView和View的區(qū)別是什么?
SurfaceView中采用了雙緩存技術(shù),在單獨的線程中更新界面
100. View的繪制過程
一個View要顯示在界面上君珠,需要經(jīng)歷一個View樹的遍歷過程寝志,這個過程又可以分為三個過程,也就是自定義View中的三要素:大小策添,位置材部,畫什么,即onMesure(),onLayout(),onDraw()。
1.onMesure()確定一個View的大小;
2.onLayout()確定View在父節(jié)點上的位置;
3.onDraw()繪制View 的內(nèi)容;
101. 講一下android中進(jìn)程的優(yōu)先級?
前臺進(jìn)程
可見進(jìn)程
服務(wù)進(jìn)程
后臺進(jìn)程
空進(jìn)程
102.根據(jù)自己的理解描述下Android數(shù)字簽名
所有的應(yīng)用程序都必須有數(shù)字證書澜沟,Android系統(tǒng)不會安裝一個沒有數(shù)字證書的應(yīng)用程序Android程序包使用的數(shù)字證書可以是自簽名的匾效,不需要一個權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證。
如果要正式發(fā)布一個Android程序爽茴,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來發(fā)布。數(shù)字證書都是有有效期的鹦聪,Android只是在應(yīng)用程序安裝的時候才會檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中蒂秘,即使證書過期也不會影響程序的正常功能泽本。
103. View、surfaceView姻僧、GLSurfaceView
View
顯示視圖规丽,內(nèi)置畫布,提供圖形繪制函數(shù)撇贺、觸屏事件赌莺、按鍵事件函數(shù)等,必須在UI主線程內(nèi)更新畫面松嘶,速度較慢
SurfaceView
基于view視圖進(jìn)行拓展的視圖類艘狭,更適合2D游戲的開發(fā),是view的子類,類似使用雙緩機(jī)制巢音,在新的線程中更新畫面所以刷新界面速度比view快
GLSurfaceView
基于SurfaceView視圖再次進(jìn)行拓展的視圖類遵倦,專用于3D游戲開發(fā)的視圖,是surfaceView的子類官撼,openGL專用
104. AsyncTask的執(zhí)行分為四個步驟
繼承AsyncTask梧躺。
實現(xiàn)AsyncTask中定義的下面一個或幾個方法onPreExecute()、doInBackground(Params…)傲绣、onProgressUpdate(Progress…)掠哥、onPostExecute(Result)。
調(diào)用execute方法必須在UI thread中調(diào)用秃诵。
該task只能被執(zhí)行一次续搀,否則多次調(diào)用時將會出現(xiàn)異常,取消任務(wù)可調(diào)用cancel顷链。內(nèi)存溢出和內(nèi)存泄漏有什么區(qū)別目代?何時會產(chǎn)生內(nèi)存泄漏?
內(nèi)存溢出:當(dāng)程序運行時所需的內(nèi)存大于程序允許的最高內(nèi)存嗤练,這時會出現(xiàn)內(nèi)存溢出榛了;內(nèi)存泄漏:在一些比較消耗資源的操作中,如果操作中內(nèi)存一直未被釋放煞抬,就會出現(xiàn)內(nèi)存泄漏霜大。比如未關(guān)閉io,cursor。
105. Activity的狀態(tài)有幾種革答?
運行
暫停
停止
106. Fragment 的 replace 和 add 方法的區(qū)別
Fragment 本身并沒有 replace 和 add 方法战坤,F(xiàn)ragmentManager才有replace和add方法。我們經(jīng)常使用的一個架構(gòu)就是通過RadioGroup切換Fragment残拐,每個 Fragment 就是一個功能模塊途茫。
Fragment 的容器一個 FrameLayout,add 的時候是把所有的 Fragment 一層一層的疊加到了溪食。FrameLayout 上了囊卜,而 replace 的話首先將該容器中的其他 Fragment 去除掉然后將當(dāng)前Fragment添加到容器中。
一個 Fragment 容器中只能添加一個 Fragment 種類错沃,如果多次添加則會報異常栅组,導(dǎo)致程序終止,而 replace 則無所謂枢析,隨便切換玉掸。因為通過 add 的方法添加的 Fragment,每個 Fragment 只能添加一次醒叁,因此如果要想達(dá)到切換效果需要通過 Fragment 的的 hide 和 show 方法結(jié)合者使用司浪。將要顯示的 show 出來泊业,將其他 hide起來。這個過程 Fragment 的生命周期沒有變化断傲。
通過 replace 切換 Fragment脱吱,每次都會執(zhí)行上一個 Fragment 的 onDestroyView,新 Fragment的 onCreateView认罩、onStart、onResume 方法续捂】汛梗基于以上不同的特點我們在使用的使用一定要結(jié)合著生命周期操作我們的視圖和數(shù)據(jù)。
107. 什么是 IntentService牙瓢?有何優(yōu)點劫拗?
IntentService 是 Service 的子類,比普通的 Service 增加了額外的功能矾克。先看 Service 本身存在兩個問題:
為 Service 的 onStartCommand 提供默認(rèn)實現(xiàn)页慷,將請求 Intent 添加到隊列中;
IntentService使用隊列的方式將請求的Intent加入隊列胁附,然后開啟一個worker thread(線程)來處理隊列中的Intent酒繁,對于異步的startService請求,IntentService會處理完成一個之后再處理第二個控妻,每一個請求都會在一個單獨的worker thread中處理州袒,不會阻塞應(yīng)用程序的主線程,這里就給我們提供了一個思路弓候,如果有耗時的操作與其在Service里面開啟新線程還不如使用IntentService來處理耗時操作郎哭。
108. 什么是 AIDL?如何使用菇存?
aidl 是 Android interface definition Language 的英文縮寫夸研,意思 Android 接口定義語言。
使用 aidl 可以幫助我們發(fā)布以及調(diào)用遠(yuǎn)程服務(wù)依鸥,實現(xiàn)跨進(jìn)程通信亥至。將服務(wù)的 aidl 放到對應(yīng)的 src 目錄,工程的 gen 目錄會生成相應(yīng)的接口類毕籽,我們通過 bindService(Intent抬闯,ServiceConnect,int)方法綁定遠(yuǎn)程服務(wù)关筒,在 bindService中 有 一 個 ServiceConnec 接 口 溶握, 我 們 需 要 覆 寫 該 類 的onServiceConnected(ComponentName,IBinder)方法,這個方法的第二個參數(shù) IBinder 對象其實就是已經(jīng)在 aidl 中定義的接口蒸播,因此我們可以將 IBinder 對象強(qiáng)制轉(zhuǎn)換為 aidl 中的接口類睡榆。我們通過 IBinder 獲取到的對象(也就是 aidl 文件生成的接口)其實是系統(tǒng)產(chǎn)生的代理對象萍肆,該代理對象既可以跟我們的進(jìn)程通信, 又可以跟遠(yuǎn)程進(jìn)程通信胀屿, 作為一個中間的角色實現(xiàn)了進(jìn)程間通信塘揣。
69.AIDL 的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?
AIDL 全稱 Android Interface Definition Language(AndRoid 接口描述語言) 是一種接口描述語言; 編譯器可以通過 aidl 文件生成一段代碼宿崭,通過預(yù)先定義的接口達(dá)到兩個進(jìn)程內(nèi)部通信進(jìn)程跨界對象訪問的目的亲铡。需要完成兩件事情:
引入 AIDL 的相關(guān)類.;
調(diào)用 aidl 產(chǎn)生的 class
理論上, 參數(shù)可以傳遞基本數(shù)據(jù)類型和 String, 還有就是 Bundle 的派生類, 不過在 Eclipse 中,目前的 ADT 不支持 Bundle 做為參數(shù)。
109. Android中任務(wù)棧的分配
Task實際上是一個Activity棧葡兑,通常用戶感受的一個Application就是一個Task奖蔓。從這個定義來看,Task跟Service或者其他Components是沒有任何聯(lián)系的讹堤,它只是針對Activity而言的吆鹤。Activity有不同的啟動模式, 可以影響到task的分配
110. 子線程中能不能 new handler?為什么洲守?
不能,如果在子線程中直接 new Handler()會拋出異常 java.lang.RuntimeException: Can’tcreate handler inside thread that has not called
那么這個Looper.prepare()方法是什么時候在哪里調(diào)用的呢疑务?
當(dāng)我們在主線程中創(chuàng)建Handler對象的時候沒有問題,是因為主線程會自動調(diào)用Looper.prepare()方法去給當(dāng)前主線程創(chuàng)建并設(shè)置一個Looper對象梗醇,隨意在Handler構(gòu)造函數(shù)中從當(dāng)前線程的對象身上拿到這個Looper知允。但是子線程中并不會自動調(diào)用這個方法,所以要想在子線程中創(chuàng)建Handler對象就必須在創(chuàng)建之前手動調(diào)用Looper.prepare()方 法婴削,否則就會報錯廊镜。
111. 談?wù)勀銓?Bitmap 的理解, 什么時候應(yīng)該手動調(diào)用 bitmap.recycle()
Bitmap 是 android 中經(jīng)常使用的一個類,它代表了一個圖片資源唉俗。 Bitmap 消耗內(nèi)存很嚴(yán)重嗤朴,如果不注意優(yōu)化代碼,經(jīng)常會出現(xiàn) OOM 問題虫溜,優(yōu)化方式通常有這么幾種:
使用緩存雹姊;
壓縮圖片;
及時回收衡楞;
至于什么時候需要手動調(diào)用 recycle吱雏,這就看具體場景了,原則是當(dāng)我們不再使用 Bitmap 時瘾境,需要回收之歧杏。另外,我們需要注意迷守,2.3 之前 Bitmap 對象與像素數(shù)據(jù)是分開存放的犬绒,Bitmap 對象存在Java Heap 中而像素數(shù)據(jù)存放在 Native Memory 中, 這時很有必要調(diào)用 recycle 回收內(nèi)存兑凿。 但是 2.3之后凯力,Bitmap 對象和像素數(shù)據(jù)都是存在 Heap 中茵瘾,GC 可以回收其內(nèi)存。
112. Activity間通過Intent傳遞數(shù)據(jù)大小有沒有限制咐鹤?
Intent在傳遞數(shù)據(jù)時是有大小限制的拗秘,這里官方并未詳細(xì)說明,不過通過實驗的方法可以測出數(shù)據(jù)應(yīng)該被限制在1MB之內(nèi)(1024KB)祈惶,筆者采用的是傳遞Bitmap的方法雕旨,發(fā)現(xiàn)當(dāng)圖片大小超過1024(準(zhǔn)確地說是1020左右)的時候,程序就會出現(xiàn)閃退捧请、停止運行等異常(不同的手機(jī)反應(yīng)不同)奸腺,因此可以判斷Intent的傳輸容量在1MB之內(nèi)。
113. andorid 應(yīng)用第二次登錄實現(xiàn)自動登錄
有兩種方式:
1血久、一個是用shareperence 或者數(shù)據(jù)庫保存上次請求成功的賬號和密碼
2、采用token或者session之類的標(biāo)記帮非,第一次請求下來保存一個token 下次直接提交這個token給服務(wù)器氧吐,服務(wù)器檢查是否有這個,這種可以保證服務(wù)器隨時可以踢掉此用戶登錄
114. 即時通訊是是怎么做的?
使用asmark 開源框架實現(xiàn)的即時通訊功能.該框架基于開源的 XMPP 即時通信協(xié)議末盔,采用 C/S 體系結(jié)構(gòu)筑舅,通過 GPRS 無線網(wǎng)絡(luò)用 TCP 協(xié)議連接到服務(wù)器,以架設(shè)開源的Openfn’e 服務(wù)器作為即時通訊平臺陨舱。
客戶端基于 Android 平臺進(jìn)行開發(fā)翠拣。負(fù)責(zé)初始化通信過程,進(jìn)行即時通信時游盲,由客戶端負(fù)責(zé)向服務(wù)器發(fā)起創(chuàng)建連接請求误墓。系統(tǒng)通過 GPRS 無線網(wǎng)絡(luò)與 Internet 網(wǎng)絡(luò)建立連接,通過服務(wù)器實現(xiàn)與Android 客戶端的即時通信腳益缎。
服務(wù)器端則采用 Openfire 作為服務(wù)器谜慌。 允許多個客戶端同時登錄并且并發(fā)的連接到一個服務(wù)器上。服務(wù)器對每個客戶端的連接進(jìn)行認(rèn)證莺奔,對認(rèn)證通過的客戶端創(chuàng)建會話欣范,客戶端與服務(wù)器端之間的通信就在該會話的上下文中進(jìn)行。
115. 怎樣對 android 進(jìn)行優(yōu)化令哟?
對 listview 的優(yōu)化恼琼。
對圖片的優(yōu)化。
對內(nèi)存的優(yōu)化屏富。
具體一些措施
盡量不要使用過多的靜態(tài)類 static
數(shù)據(jù)庫使用完成后要記得關(guān)閉 cursor
廣播使用完之后要注銷
116. GC是什么? 為什么要有GC?
GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方晴竞,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java 提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達(dá)到自動回收內(nèi)存的目的役听,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法颓鲜。
117. switch語句能否作用在byte上表窘,能否作用在long上,能否作用在String上?
switch能作用在byte甜滨、char乐严、short和int上,JDK1.7后可以作用在String上衣摩。
118. 同步和異步有何異同昂验,在什么情況下分別使用他們?
同步指同一時間只能一個線程執(zhí)行該方法艾扮,其他線程需要等待既琴。異步指多個線程可以同時執(zhí)行某個方法,并共享同一資源泡嘴。
同步可以讓訪問的資源具有安全性甫恩,因為同一時間只能一個線程對其進(jìn)行訪問。但是效率不高酌予。
異步對訪問的資源會造成不穩(wěn)定性磺箕,比如多個線程同時訪問一個資源,一個在修改抛虫、一個在刪除松靡、一個在讀取,這樣可能會造成資源的混亂建椰。但是由于同時運行雕欺, 執(zhí)行效率得到提高。
119. 啟動一個線程是用run()還是start()?
start()方法啟動線程棉姐,run方法是線程執(zhí)行的主方法屠列。
120. 作用域public,private,protected,以及不寫時的區(qū)別
public公共修飾符,表示任意類都可以訪問谅海。
protected為受保護(hù)的修飾符脸哀,表示同類、同包以及不同包但是父子關(guān)系的是可以訪問扭吁。
不寫表示默認(rèn)修飾符撞蜂,或者稱為package修飾符,該修飾符表示只有同類或同包下的類可以訪問侥袜,出了這個包就不能訪問了蝌诡。
private為私有修飾符,表示只有同類中可以訪問枫吧,出了這個類就不能訪問了浦旱。
121. 描述一下JVM加載class文件的原理機(jī)制?
JVM中類的裝載是由ClassLoader和它的子類來實現(xiàn)的,Java ClassLoader 是一個重要的Java運行時系統(tǒng)組件。它負(fù)責(zé)在運行時查找和裝入類文件的類九杂。
122. 什么是java序列化颁湖,如何實現(xiàn)java序列化宣蠕?
序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化甥捺∏朗矗可以對流化后的對象進(jìn)行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間镰禾。序 列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題皿曲。
序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法吴侦,implements Serializable只是為了標(biāo)注該對象是可被序列化 的屋休,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流)對象,接著备韧,使用ObjectOutputStream對象的 writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài))劫樟,要恢復(fù)的話則用輸入流。
123. listView展示數(shù)據(jù)幾種形式
從sqlite拉取數(shù)據(jù)源顯示
從xml使用pull解析拉取數(shù)據(jù)源顯示
從網(wǎng)絡(luò)上拉取數(shù)據(jù)源顯示
124. 兩activity之間怎么傳遞數(shù)據(jù)织堂?
基本數(shù)據(jù)類型可以通過. Intent 傳遞數(shù)據(jù)
在A activity中
Intent intent = new Intent();
intent.putExtra(name, value)
Bundle bundle = new Bundle();
bundle.putBoolean(key,value);
intent.putExtras(bundle);
extras.putDouble(key, value)
// 通過intent putExtra 方法 基本數(shù)據(jù)類型 都傳遞
Intent i = getIntent();
i.getExtras();
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value")
Bundle bundle = new Bundle();
bumdle.putShort(key, value);
intent.putExtras(bumdle);
intent.putExtras(bundle)
125. 請解釋下Android程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別
Android程序執(zhí)行需要讀取到安全敏感項必需在androidmanifest.xml中聲明相關(guān)權(quán)限請求, 打電話,訪問網(wǎng)絡(luò),獲取坐標(biāo),讀寫sd卡,讀寫聯(lián)系人等..安裝的時候會提示用戶…
文件系統(tǒng)的權(quán)限是linux權(quán)限. 比如說sharedpreference里面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable
126. Android程序與Java程序的區(qū)別毅哗?
Android程序用android sdk開發(fā),java程序用javasdk開發(fā).
Android SDK引用了大部分的Java SDK,少數(shù)部分被Android SDK拋棄捧挺,比如說界面部分,java.awt swing package除了java.awt.font被引用外尿瞭,其他都被拋棄闽烙,在Android平臺開發(fā)中不能使用。 android sdk 添加工具jar httpclient , pull opengl
將Java 游戲或者j2me程序移植到Android平臺的過程中声搁,Android SDK 與Java SDK的區(qū)別是很需要注意的地方黑竞。
127. 談?wù)凙ndroid的優(yōu)點和不足之處
1、開放性,開源ophone 阿里云( 完全兼容android)
2疏旨、掙脫運營商束縛
3很魂、豐富的硬件選擇 mtk android
4、不受任何限制的開發(fā)商
5檐涝、無縫結(jié)合的Google應(yīng)用
缺點也有5處:
1遏匆、安全問題、隱私問題
2谁榜、賣手機(jī)的不是最大運營商
3幅聘、運營商對Android手機(jī)仍然有影響
4、山寨化嚴(yán)重
5窃植、過分依賴開發(fā)商帝蒿,缺乏標(biāo)準(zhǔn)配置
128. Android UI中的View如何刷新
在主線程中 拿到view調(diào)用Invalide()方法,查看畫畫板里面更新imageview的方法
在子線程里面可以通過postInvalide()方法;
129. 顯式intent和隱式intent的區(qū)別是什么
顯式Intent:對于明確指出了目標(biāo)組件名稱的Intent,我們稱之為顯式Intent巷怜。
隱式Intent:對于沒有明確指出目標(biāo)組件名稱的Intent葛超,則稱之為隱式Intent暴氏。
顯式Intent直接用組件的名稱定義目標(biāo)組件,這種方式很直接绣张。但是由于開發(fā)人員往往并不清楚別的應(yīng)用程序的組件名稱答渔,因此,顯式Intent更多用于應(yīng)用程序內(nèi)部傳遞消息胖替。比如在某應(yīng)用程序內(nèi)研儒,一個Activity啟動一個Service。
隱式Intent恰恰相反独令,它不會用組件名稱定義需要激活的目標(biāo)組件端朵,它更廣泛地用于在不同應(yīng)用程序之間傳遞消息。
另外燃箭,在顯式Intent消息中冲呢,決定目標(biāo)組件的唯一要素就是組件名稱,一旦名稱確定招狸,就不需要其他內(nèi)容即可找到相應(yīng)組件敬拓。 但在隱式Intent中需要借助過濾器IntentFilter 來尋找與之相匹配的組件
130. 什么是ANR 如何避免它?
ANR:Application Not Responding。
產(chǎn)生原因:在Android中裙戏,活動管理器和窗口管理器這兩個系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視應(yīng)用程序的響應(yīng)乘凸,當(dāng)用戶的操作在5s內(nèi)應(yīng)用程序沒能做出反應(yīng),BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢累榜,就會出現(xiàn)應(yīng)用程序無響應(yīng)對話框营勤,這就是ANR。
解決方式:Activity應(yīng)該在它的關(guān)鍵生命周期方法里盡可能少的去做創(chuàng)建操作壹罚、潛在的耗時操作(網(wǎng)絡(luò)或數(shù)據(jù)庫操作等)葛作,或者高耗時的計算操作(改變位圖尺寸等),而應(yīng)該在子線程里(或者異步方式)來完成猖凛。主線程應(yīng)該為子線程提供一個Handler赂蠢,以便子線程完成時能夠提交給主線程。
131. 系統(tǒng)上安裝了多種瀏覽器辨泳,能否指定某瀏覽器訪問指定頁面虱岂?請說明原由
1、默認(rèn)瀏覽器:
在Android程序中我們可以通過發(fā)送隱式Intent來啟動系統(tǒng)默認(rèn)的瀏覽器菠红。
Intent intent =new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url =Uri.parse("http://www.163.com");
intent.setData(content_url);
startActivity(intent);
2量瓜、指定瀏覽器:
如果手機(jī)本身安裝了多個瀏覽器而又沒有設(shè)置默認(rèn)瀏覽器的話,系統(tǒng)將讓用戶選擇使用哪個瀏覽器來打開連接途乃。
另外绍傲,也可以發(fā)送顯示Intent來啟動瀏覽器。如下面就是啟動Android原生瀏覽器的例子:
Intent intent =new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url =Uri.parse("http://www.163.com");
intent.setData(content_url);
intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
startActivity(intent);
注:要啟動其他瀏覽器只需修改intent.setClassName()里面的參數(shù)就OK了。
常見的瀏覽器:
uc瀏覽器":"com.uc.browser", "com.uc.browser.ActivityUpdate“
opera瀏覽器:"com.opera.mini.android", "com.opera.mini.android.Browser"
qq瀏覽器:"com.tencent.mtt", “com.tencent.mtt.MainActivity"
131. 了解Android系統(tǒng)架構(gòu)
應(yīng)用層: Java應(yīng)用開發(fā)工程師開發(fā)的所有應(yīng)用程序比如地圖,瀏覽器,QQ等屬于該層,手機(jī)中的短信,撥號,瀏覽器等這些應(yīng)用程序都是可以被開發(fā)人員開發(fā)的其他應(yīng)用程序所替換烫饼,這點不同于其他手機(jī)操作系統(tǒng)固化在系統(tǒng)內(nèi)部的系統(tǒng)軟件猎塞,更加靈活和個性化
應(yīng)用框架層:Java framework層源碼OS定制開發(fā)為應(yīng)用層開發(fā)人員提供API
系統(tǒng)運行庫層: C語言包括C語言標(biāo)準(zhǔn)庫,多媒體庫,OpenGL ES, SQLite, Webkit,Dalvik虛擬機(jī)等,該層是對應(yīng)用框架層提供支持的層, Java訪問硬件需通過NDK實現(xiàn)
Linux內(nèi)核層:Android是基于Linux2.6內(nèi)核,其核心系統(tǒng)服務(wù)如安全性杠纵、內(nèi)存管理荠耽、進(jìn)程管理、網(wǎng)路協(xié)議以及驅(qū)動模型都依賴于Linux內(nèi)核
132. DVM與JVM區(qū)別
區(qū)別一:dvm執(zhí)行的是.dex格式文件jvm執(zhí)行的是.class文件android程序編譯完之后生產(chǎn).class文件比藻,然后铝量,dex工具會把.class文件處理成.dex文件,然后把資源文件和.dex文件等打包成.apk文件银亲。apk就是android package的意思慢叨。jvm執(zhí)行的是.class文件。
區(qū)別二:dvm是基于寄存器的虛擬機(jī)而jvm執(zhí)行是基于虛擬棧的虛擬機(jī)务蝠。寄存器存取速度比椗男常快的多,dvm可以根據(jù)硬件實現(xiàn)最大的優(yōu)化馏段,比較適合移動設(shè)備轩拨。
區(qū)別三:.class文件存在很多的冗余信息,dex工具會去除冗余信息院喜,并把所有的.class文件整合到.dex文件中亡蓉。減少了I/O操作,提高了類的查找速度
133. C/S和B/S兩種架構(gòu)的概念喷舀、區(qū)別和聯(lián)系
一寸宵、C/S 架構(gòu)
1、 概念
C/S 架構(gòu)是一種典型的兩層架構(gòu)元咙,其全程是Client/Server,即客戶端服務(wù)器端架構(gòu)巫员,其客戶端包含一個或多個在用戶的電腦上運行的程序庶香,而服務(wù)器端有兩種,一種是數(shù)據(jù)庫服務(wù)器端简识,客戶端通過數(shù)據(jù)庫連接訪問服務(wù)器端的數(shù)據(jù)赶掖;另一種是Socket服務(wù)器端,服務(wù)器端的程序通過Socket與客戶端的程序通信七扰。
C/S 架構(gòu)也可以看做是胖客戶端架構(gòu)奢赂。因為客戶端需要實現(xiàn)絕大多數(shù)的業(yè)務(wù)邏輯和界面展示。這種架構(gòu)中颈走,作為客戶端的部分需要承受很大的壓力膳灶,因為顯示邏輯和事務(wù)處理都包含在其中,通過與數(shù)據(jù)庫的交互(通常是SQL或存儲過程的實現(xiàn))來達(dá)到持久化數(shù)據(jù),以此滿足實際項目的需要轧钓。
2 序厉、優(yōu)點和缺點
優(yōu)點:
2.1 C/S架構(gòu)的界面和操作可以很豐富。
2.2 安全性能可以很容易保證毕箍,實現(xiàn)多層認(rèn)證也不難弛房。
2.3 由于只有一層交互,因此響應(yīng)速度較快而柑。
缺點:
2.4 適用面窄文捶,通常用于局域網(wǎng)中。
2.5 用戶群固定媒咳。由于程序需要安裝才可使用粹排,因此不適合面向一些不可知的用戶。
2.6 維護(hù)成本高伟葫,發(fā)生一次升級恨搓,則所有客戶端的程序都需要改變。
二筏养、B/S架構(gòu)
1斧抱、概念
B/S架構(gòu)的全稱為Browser/Server,即瀏覽器/服務(wù)器結(jié)構(gòu)渐溶。Browser指的是Web瀏覽器辉浦,極少數(shù)事務(wù)邏輯在前端實現(xiàn),但主要事務(wù)邏輯在服務(wù)器端實現(xiàn)茎辐,Browser客戶端宪郊,WebApp服務(wù)器端和DB端構(gòu)成所謂的三層架構(gòu)。B/S架構(gòu)的系統(tǒng)無須特別安裝拖陆,只有Web瀏覽器即可弛槐。
B/S架構(gòu)中,顯示邏輯交給了Web瀏覽器依啰,事務(wù)處理邏輯在放在了WebApp上乎串,這樣就避免了龐大的胖客戶端,減少了客戶端的壓力速警。因為客戶端包含的邏輯很少叹誉,因此也被成為瘦客戶端。
2 闷旧、優(yōu)點和缺點
優(yōu)點:
1)客戶端無需安裝长豁,有Web瀏覽器即可。
2)BS架構(gòu)可以直接放在廣域網(wǎng)上忙灼,通過一定的權(quán)限控制實現(xiàn)多客戶訪問的目的匠襟,交互性較強(qiáng)。
3)BS架構(gòu)無需升級多個客戶端,升級服務(wù)器即可宅此。
缺點:
1)在跨瀏覽器上机错,BS架構(gòu)不盡如人意。
2)表現(xiàn)要達(dá)到CS程序的程度需要花費不少精力父腕。
3)在速度和安全性上需要花費巨大的設(shè)計成本弱匪,這是BS架構(gòu)的最大問題。
4)客戶端服務(wù)器端的交互是請求-響應(yīng)模式璧亮,通常需要刷新頁面萧诫,這并不是客戶樂意看到的。(在Ajax風(fēng)行后此問題得到了一定程度的緩解)
134. TCP/IP枝嘶、Http帘饶、Socket的區(qū)別
網(wǎng)絡(luò)由下往上分為
物理層、數(shù)據(jù)鏈路層群扶、網(wǎng)絡(luò)層及刻、傳輸層、會話層竞阐、表示層和應(yīng)用層缴饭。
通過初步的了解,我知道IP協(xié)議對應(yīng)于網(wǎng)絡(luò)層骆莹,TCP協(xié)議對應(yīng)于傳輸層颗搂,而HTTP協(xié)議對應(yīng)于應(yīng)用層,
三者從本質(zhì)上來說沒有可比性幕垦,
socket則是對TCP/IP協(xié)議的封裝和應(yīng)用(程序員層面上)丢氢。
也可以說,TPC/IP協(xié)議是傳輸層協(xié)議先改,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸疚察,
而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)仇奶。
關(guān)于TCP/IP和HTTP協(xié)議的關(guān)系貌嫡,網(wǎng)絡(luò)有一段比較容易理解的介紹:
“我們在傳輸數(shù)據(jù)時,可以只使用(傳輸層)TCP/IP協(xié)議猜嘱,但是那樣的話,如果沒有應(yīng)用層嫁艇,便無法識別數(shù)據(jù)內(nèi)容朗伶。
如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議步咪。
應(yīng)用層協(xié)議有很多论皆,比如HTTP、FTP、TELNET等点晴,也可以自己定義應(yīng)用層協(xié)議感凤。
WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息粒督,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上陪竿。”
而我們平時說的最多的socket是什么呢屠橄,實際上socket是對TCP/IP協(xié)議的封裝族跛,Socket本身并不是協(xié)議困乒,而是一個調(diào)用接口(API)呻惕。
通過Socket,我們才能使用TCP/IP協(xié)議铜涉。
實際上溪北,Socket跟TCP/IP協(xié)議沒有必然的聯(lián)系桐绒。
Socket編程接口在設(shè)計的時候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議之拨。
所以說茉继,Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對TCP/IP協(xié)議的抽象敦锌,
從而形成了我們知道的一些最基本的函數(shù)接口馒疹,比如create、listen乙墙、connect颖变、accept、send听想、read和write等等腥刹。
網(wǎng)絡(luò)有一段關(guān)于socket和TCP/IP協(xié)議關(guān)系的說法比較容易理解:
“TCP/IP只是一個協(xié)議棧,就像操作系統(tǒng)的運行機(jī)制一樣汉买,必須要具體實現(xiàn)衔峰,同時還要提供對外的操作接口。
這個就像操作系統(tǒng)會提供標(biāo)準(zhǔn)的編程接口蛙粘,比如win32編程接口一樣垫卤,
TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口出牧⊙ㄖ猓”
關(guān)于TCP/IP協(xié)議的相關(guān)只是,用博大精深來講我想也不為過舔痕,單單查一下網(wǎng)上關(guān)于此類只是的資料和書籍文獻(xiàn)的數(shù)量就知道评抚,
這個我打算會買一些經(jīng)典的書籍(比如《TCP/IP詳解:卷一豹缀、卷二、卷三》)進(jìn)行學(xué)習(xí)慨代,今天就先總結(jié)一些基于基于TCP/IP協(xié)議的應(yīng)用和編程接口的知識邢笙,也就是剛才說了很多的HTTP和Socket。
CSDN上有個比較形象的描述:HTTP是轎車侍匙,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機(jī)氮惯,提供了網(wǎng)絡(luò)通信的能力。
實際上丈积,傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的筐骇,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議江滨,就像上面所說铛纬,它只是提供了一個針對TCP或者UDP編程的接口。
下面是一些經(jīng)常在筆試或者面試中碰到的重要的概念唬滑,特在此做摘抄和總結(jié)告唆。
一、什么是TCP連接的三次握手
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器晶密,并進(jìn)入SYN_SEND狀態(tài)擒悬,等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)稻艰,同時自己也發(fā)送一個SYN包(syn=k)懂牧,即SYN+ACK包,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包尊勿,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)僧凤,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)元扔,完成三次握手躯保。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后澎语,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)途事。
理想狀態(tài)下,TCP連接一旦建立擅羞,在通信雙方中的任何一方主動關(guān)閉連接之前尸变,TCP 連接都將被一直保持下去。
斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求减俏,斷開過程需要經(jīng)過“四次握手”(過程就不細(xì)寫了召烂,就是服務(wù)器和客戶端交互,最終確定斷開)
二垄懂、利用Socket建立網(wǎng)絡(luò)連接的步驟
建立Socket連接至少需要一對套接字骑晶,其中一個運行于客戶端,稱為ClientSocket 草慧,另一個運行于服務(wù)器端桶蛔,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽漫谷,客戶端請求仔雷,連接確認(rèn)。
1舔示、服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字碟婆,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)惕稻,等待客戶端的連接請求竖共。
2、客戶端請求:指客戶端的套接字提出連接請求俺祠,要連接的目標(biāo)是服務(wù)器端的套接字公给。
為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字蜘渣,指出服務(wù)器端套接字的地址和端口號淌铐,然后就向服務(wù)器端套接字提出連接請求。
3蔫缸、連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時腿准,就響應(yīng)客戶端套接字的請求,建立一個新的線程拾碌,把服務(wù)器端套接字的描述發(fā)給客戶端吐葱,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接倦沧。
而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)唇撬,繼續(xù)接收其他客戶端套接字的連接請求。
三展融、HTTP鏈接的特點
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol )窖认,是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一告希,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用扑浸。
HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng),在請求結(jié)束后燕偶,會主動釋放連接喝噪。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
四指么、TCP和UDP的區(qū)別(考得最多酝惧。榴鼎。快被考爛了我覺得- -\)
1晚唇、TCP是面向鏈接的巫财,雖然說網(wǎng)絡(luò)的不安全不穩(wěn)定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;
而UDP不是面向連接的哩陕,UDP傳送數(shù)據(jù)前并不與對方建立連接平项,對接收到的數(shù)據(jù)也不發(fā)送確認(rèn)信號,發(fā)送端不知道數(shù)據(jù)是否會正確接收悍及,當(dāng)然也不用重發(fā)闽瓢,所以說UDP是無連接的、不可靠的一種數(shù)據(jù)傳輸協(xié)議心赶。
2扣讼、也正由于1所說的特點,使得UDP的開銷更小數(shù)據(jù)傳輸速率更高缨叫,因為不必進(jìn)行收發(fā)數(shù)據(jù)的確認(rèn)届谈,所以UDP的實時性更好。
知道了TCP和UDP的區(qū)別弯汰,就不難理解為何采用TCP傳輸協(xié)議的MSN比采用UDP的QQ傳輸文件慢了艰山,但并不能說QQ的通信是不安全的,
因為程序員可以手動對UDP的數(shù)據(jù)收發(fā)進(jìn)行驗證咏闪,比如發(fā)送方對每個數(shù)據(jù)包進(jìn)行編號然后由接收方進(jìn)行驗證啊什么的曙搬,
即使是這樣,UDP因為在底層協(xié)議的封裝上沒有采用類似TCP的“三次握手”而實現(xiàn)了TCP所無法達(dá)到的傳輸效率鸽嫂。
135. HTTP和SOAP完全就是兩個不同的協(xié)議
HTTP只負(fù)責(zé)把數(shù)據(jù)傳送過去纵装,不會管這個數(shù)據(jù)是XML、HTML据某、圖片橡娄、文本文件或者別的什么。而SOAP協(xié)議則定義了怎么把一個對象變成XML文本癣籽,在遠(yuǎn)程如何調(diào)用等挽唉,怎么能夠混為一談。
這樣說兩種協(xié)議:
HTTP就是郵局的協(xié)議筷狼,他們規(guī)定了你的信封要怎么寫瓶籽,要貼多少郵票等。埂材。塑顺。。
SOAP就是你們之間交流的協(xié)議俏险,負(fù)責(zé)把你所需要表達(dá)的意思寫在信紙上严拒,同時也負(fù)責(zé)讓對方能夠看得懂你的信扬绪。
Web service一般就是用SOAP協(xié)議通過HTTP來調(diào)用它,其實他就是一個WSDL文檔裤唠,客戶都可以閱讀WSDL文檔來用這個Web service勒奇。客戶根據(jù)WSDL描述文檔巧骚,會生成一個SOAP請求消息。Web service都是放在Web服務(wù)器 (如IIS) 后面的格二,客戶生成的SOAP請求會被嵌入在一個HTTP POST請求中劈彪,發(fā)送到Web服務(wù)器來。Web服務(wù)器再把這些請求轉(zhuǎn)發(fā)給Web service請求處理器顶猜。請求處理器的作用在于沧奴,解析收到的SOAP請求,調(diào)用Web service长窄,然后再生成相應(yīng)的SOAP應(yīng)答滔吠。Web服務(wù)器得到SOAP應(yīng)答后,會再通過HTTP應(yīng)答的方式把它送回到客戶端挠日。
webService協(xié)議主要包括兩個方面:傳輸協(xié)議和數(shù)據(jù)表示疮绷,關(guān)于傳輸協(xié)議可以是http或其他,數(shù)據(jù)表示也可以是鍵值對嚣潜、xml或其他冬骚,只不過現(xiàn)在通用的是http+soap,當(dāng)然其他的也可以懂算,不知道這樣理解對不對只冻?
SOAP簡單的理解,就是這樣的一個開放協(xié)議SOAP=RPC+HTTP+XML:采用HTTP作為底層通訊協(xié)議计技;RPC作為一致性的調(diào)用途徑喜德,XML作為數(shù)據(jù)傳送的格式,允許服務(wù)提供者和服務(wù)客戶經(jīng)過防火墻在INTERNET進(jìn)行通訊交互垮媒。
136. 怎么讓在啟動一個Activity是就啟動一個service
首先定義好一個service舍悯,然后在Activity的onCreate里面進(jìn)行連接并bindservice或者直接startService
137. 使用多線程和雙緩沖
Android的SurfaceView是View的子類,她同時也實現(xiàn)了雙緩沖睡雇。你可以定義一個她的子類并實現(xiàn)Surfaceholder.Callback接口贱呐。由于SurfaceHolder.Callback接口,新線程就不要android.os.Handler幫忙了入桂。SurfaceHolder中l(wèi)ockCanvas()方法可以鎖定畫布奄薇,繪制完新的圖像后調(diào)用unlockCanvasand Post解鎖。
138. Object有哪些公用方法?
方法equals測試的是兩個對象是否相等
方法clone進(jìn)行對象拷貝
方法getClass返回和當(dāng)前對象相關(guān)的Class對象
方法notify,notifyall,wait都是用來對給定對象進(jìn)行線程同步的
139. Java的四種引用的區(qū)別
強(qiáng)引用:如果一個對象具有強(qiáng)引用抗愁,它就不會被垃圾回收器回收馁蒂。即使當(dāng)前內(nèi)存空間不足呵晚,JVM 也不會回收它,而是拋出 OutOfMemoryError 錯誤沫屡,使程序異常終止饵隙。如果想中斷強(qiáng)引用和某個對象之間的關(guān)聯(lián),可以顯式地將引用賦值為null沮脖,這樣一來的話金矛,JVM在合適的時間就會回收該對象
軟引用:在使用軟引用時,如果內(nèi)存的空間足夠勺届,軟引用就能繼續(xù)被使用驶俊,而不會被垃圾回收器回收,只有在內(nèi)存不足時免姿,軟引用才會被垃圾回收器回收饼酿。
弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當(dāng) JVM 進(jìn)行垃圾回收胚膊,一旦發(fā)現(xiàn)弱引用對象故俐,無論當(dāng)前內(nèi)存空間是否充足,都會將弱引用回收紊婉。不過由于垃圾回收器是一個優(yōu)先級較低的線程药版,所以并不一定能迅速發(fā)現(xiàn)弱引用對象
虛引用:顧名思義,就是形同虛設(shè)喻犁,如果一個對象僅持有虛引用刚陡,那么它相當(dāng)于沒有引用,在任何時候都可能被垃圾回收器回收株汉。
140. 若Activity已經(jīng)銷毀筐乳,此時AsynTask執(zhí)行完并且返回結(jié)果,會報異常嗎?
當(dāng)一個App旋轉(zhuǎn)時乔妈,整個Activity會被銷毀和重建蝙云。當(dāng)Activity重啟時,AsyncTask中對該Activity的引用是無效的路召,因此onPostExecute()就不會起作用勃刨,若AsynTask正在執(zhí)行,折會報 view not attached to window manager 異常
同樣也是生命周期的問題股淡,在 Activity 的onDestory()方法中調(diào)用Asyntask.cancal方法身隐,讓二者的生命周期同步
141. Activity銷毀但Task如果沒有銷毀掉,當(dāng)Activity重啟時這個AsyncTask該如何解決?
還是屏幕旋轉(zhuǎn)這個例子唯灵,在重建Activity的時候贾铝,會回掉Activity.onRetainNonConfigurationInstance()重新傳遞一個新的對象給AsyncTask,完成引用的更新
142. Android 線程間通信有哪幾種方式(重要)
共享內(nèi)存(變量);
文件,數(shù)據(jù)庫;
Handler;
Java 里的 wait()垢揩,notify()玖绿,notifyAll()
143. 請介紹下 AsyncTask的內(nèi)部實現(xiàn),適用的場景
AsyncTask 內(nèi)部也是 Handler 機(jī)制來完成的叁巨,只不過 Android 提供了執(zhí)行框架來提供線程池來
執(zhí)行相應(yīng)地任務(wù)斑匪,因為線程池的大小問題,所以 AsyncTask 只應(yīng)該用來執(zhí)行耗時時間較短的任務(wù)锋勺,
比如 HTTP 請求蚀瘸,大規(guī)模的下載和數(shù)據(jù)庫的更改不適用于 AsyncTask,因為會導(dǎo)致線程池堵塞庶橱,沒有
線程來執(zhí)行其他的任務(wù)贮勃,導(dǎo)致的情形是會發(fā)生 AsyncTask 根本執(zhí)行不了的問題。
144. 推送心跳包是TCP包還是UDP包或者HTTP包
心跳包的實現(xiàn)是調(diào)用了socket.sendUrgentData(0xFF)這句代碼實現(xiàn)的悬包,所以,當(dāng)然是TCP包馍乙。
145. 如何實現(xiàn)文件斷點上傳
在 Android 中上傳文件可以采用 HTTP 方式布近,也可以采用 Socket 方式,但是 HTTP 方式不能上傳
大文件丝格,這里介紹一種通過 Socket 方式來進(jìn)行斷點續(xù)傳的方式撑瞧,服務(wù)端會記錄下文件的上傳進(jìn)度,
當(dāng)某一次上傳過程意外終止后显蝌,下一次可以繼續(xù)上傳预伺,這里用到的其實還是 J2SE 里的知識。
這個上傳程序的原理是:客戶端第一次上傳時向服務(wù)端發(fā)送
“Content-Length=35;filename=WinRAR_3.90_SC.exe;sourceid=“這種格式的字符串曼尊,服務(wù)端 收到后會查找該文件是否有上傳記錄酬诀,如果有就返回已經(jīng)上傳的位置,否則返回新生成的 sourceid 以及 position 為 0骆撇,類似 sourceid=2324838389;position=0“這樣的字符串瞒御,客戶端收到返回后 的字符串后再從指定的位置開始上傳文件。
146. Fragment 在你們項目中的使用
Fragment 是 android3.0 以后引入的的概念神郊,做局部內(nèi)容更新更方便肴裙,原來為了到達(dá)這一點要把多個布局放到一個 activity 里面,現(xiàn)在可以用多 Fragment 來代替涌乳,只有在需要的時候才加載Fragment蜻懦,提高性能。
147. 如何自定義ViewGroup
1.指定的LayoutParams
2.onMeasure中計算所有childView的寬和高夕晓,然后根據(jù)childView的寬和高宛乃,計算自己的寬和高。(當(dāng)然,如果不是wrap_content烤惊,直接使用父ViewGroup傳入的計算值即可)
3.onLayout中對所有的childView進(jìn)行布局乔煞。
148. View中onTouch,onTouchEvent柒室,onClick的執(zhí)行順序
dispatchTouchEvent—->onTouch—->onTouchEvent—–>onClick渡贾。在所有ACTION_UP事件之后才觸發(fā)onClick點擊事件。
149. ListView卡頓的原因與性能優(yōu)化雄右,越多越好
重用converView: 通過復(fù)用converview來減少不必要的view的創(chuàng)建空骚,另外Infalte操作會把xml文件實例化成相應(yīng)的View實例,屬于IO操作擂仍,是耗時操作囤屹。
減少findViewById()操作: 將xml文件中的元素封裝成viewholder靜態(tài)類,通過converview的setTag和getTag方法將view與相應(yīng)的holder對象綁定在一起逢渔,避免不必要的findviewbyid操作
避免在 getView 方法中做耗時的操作: 例如加載本地 Image 需要載入內(nèi)存以及解析 Bitmap 肋坚,都是比較耗時的操作,如果用戶快速滑動listview肃廓,會因為getview邏輯過于復(fù)雜耗時而造成滑動卡頓現(xiàn)象智厌。用戶滑動時候不要加載圖片,待滑動完成再加載盲赊,可以使用這個第三方庫glide
Item的布局層次結(jié)構(gòu)盡量簡單铣鹏,避免布局太深或者不必要的重繪
盡量能保證 Adapter 的 hasStableIds() 返回 true 這樣在 notifyDataSetChanged() 的時候,如果item內(nèi)容并沒有變化哀蘑,ListView 將不會重新繪制這個 View诚卸,達(dá)到優(yōu)化的目的
在一些場景中,ScollView內(nèi)會包含多個ListView绘迁,可以把listview的高度寫死固定下來合溺。 由于ScollView在快速滑動過程中需要大量計算每一個listview的高度,阻塞了UI線程導(dǎo)致卡頓現(xiàn)象出現(xiàn)缀台,如果我們每一個item的高度都是均勻的辫愉,可以通過計算把listview的高度確定下來,避免卡頓現(xiàn)象出現(xiàn)
使用 RecycleView 代替listview: 每個item內(nèi)容的變動将硝,listview都需要去調(diào)用notifyDataSetChanged來更新全部的item恭朗,太浪費性能了。RecycleView可以實現(xiàn)當(dāng)個item的局部刷新依疼,并且引入了增加和刪除的動態(tài)效果痰腮,在性能上和定制上都有很大的改善
ListView 中元素避免半透明: 半透明繪制需要大量乘法計算,在滑動時不停重繪會造成大量的計算律罢,在比較差的機(jī)子上會比較卡膀值。 在設(shè)計上能不半透明就不不半透明棍丐。實在要弄就把在滑動的時候把半透明設(shè)置成不透明,滑動完再重新設(shè)置成半透明沧踏。
盡量開啟硬件加速: 硬件加速提升巨大歌逢,避免使用一些不支持的函數(shù)導(dǎo)致含淚關(guān)閉某個地方的硬件加速。當(dāng)然這一條不只是對 ListView翘狱。
150. 三級緩存的原理
從緩存中加載秘案。
從本地文件中加載(數(shù)據(jù)庫,SD)
從網(wǎng)絡(luò)加載潦匈。
a.加載 bitmap 的時候無需考慮 bitmap 加載過程中出現(xiàn)的 oom(內(nèi)存溢出)和 android 容器快速
滑動的時候出現(xiàn)的圖片錯位等現(xiàn)象阱高。(16M)
b. 支持加載網(wǎng)絡(luò)圖片和本地圖片。
c. 內(nèi)存管理使用的 lru 算法(移除里面是有頻率最少的對象)茬缩,更好的管理 bitmap 的內(nèi)存
151. apk安裝卸載的原理
安裝過程:復(fù)制apk安裝包到data/app目錄下赤惊,解壓并掃描安裝包,把dex文件(dalvik字節(jié)碼)保存到dalvik-cache目錄凰锡,并data/data目錄下創(chuàng)建對應(yīng)的應(yīng)用數(shù)據(jù)目錄未舟。
卸載過程:刪除安裝過程中在上述三個目錄下創(chuàng)建的文件及目錄。