無標題文章

1.要做一個盡可能流暢的ListView,你平時在工作中如何進行優(yōu)化的? ①Item布局,層級越少越好,使用hierarchyview工具查看優(yōu)化。 ②復用convertView ③使用ViewHolder ④item中有圖片時,異步加載 ⑤快速滑動時,不加載圖片 ⑥item中有圖片時,應對圖片進行適當壓縮 ⑦實現(xiàn)數(shù)據(jù)的分頁加載
2.對于Android 的安全問題,你知道多少 ①錯誤導出組件 ② 參數(shù)校驗不嚴 ③WebView引入各種安全問題,webview中的js注入 ④不混淆、不防二次打包 ⑤明文存儲關鍵信息 ⑦ 錯誤使用HTTPS ⑧山寨加密方法 ⑨濫用權(quán)限、內(nèi)存泄露、使用debug簽名
3. 如何縮減APK包大小? 代碼 保持良好的編程習慣,不要重復或者不用的代碼,謹慎添加libs,移除使用不到的libs。 使用proguard混淆代碼,它會對不用的代碼做優(yōu)化,并且混淆后也能夠減少安裝包的大小。 native code的部分,大多數(shù)情況下只需要支持armabi與x86的架構(gòu)即可。如果非必須,可以考慮拿掉x86的部分。 資源 使用Lint工具查找沒有使用到的資源。去除不使用的圖片,String,XML等等。 assets目錄下的資源請確保沒有用不上的文件。 生成APK的時候,aapt工具本身會對png做優(yōu)化,但是在此之前還可以使用其他工具如tinypng對圖片進行進一步的壓縮預處理。 jpeg還是png,根據(jù)需要做選擇,在某些時候jpeg可以減少圖片的體積。 對于9.png的圖片,可拉伸區(qū)域盡量切小,另外可以通過使用9.png拉伸達到大圖效果的時候盡量不要使用整張大圖。 策略 有選擇性的提供hdpi,xhdpi,xxhdpi的圖片資源。建議優(yōu)先提供xhdpi的圖片,對于mdpi,ldpi與xxxhdpi根據(jù)需要提供有差異的部分即可。 盡可能的重用已有的圖片資源。例如對稱的圖片,只需要提供一張,另外一張圖片可以通過代碼旋轉(zhuǎn)的方式實現(xiàn)。 能用代碼繪制實現(xiàn)的功能,盡量不要使用大量的圖片。例如減少使用多張圖片組成animate-list的AnimationDrawable,這種方式提供了多張圖片很占空間。
4.Android與服務器交互的方式中的對稱加密和非對稱加密是什么? 對稱加密,就是加密和解密數(shù)據(jù)都是使用同一個key,這方面的算法有DES。 非對稱加密,加密和解密是使用不同的key。發(fā)送數(shù)據(jù)之前要先和服務端約定生成公鑰和私鑰,使用公鑰加密的數(shù)據(jù)可以用私鑰解密,反之。這方面的算法有RSA。ssh 和 ssl都是典型的非對稱加密。
5.設備橫豎屏切換的時候,接下來會發(fā)生什么? 1、不設置Activity的android:configChanges時,切屏會重新調(diào)用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次 2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏時只會執(zhí)行一次 3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法
6.Android啟動Service的兩種方式是什么? 它們的適用情況是什么? 如果后臺服務開始后基本可以獨立運行的話,可以用startService。音樂播放器就可以這樣用。它們會一直運行直到你調(diào)用 stopSelf或者stopService。你可以通過發(fā)送Intent或者接收Intent來與正在運行的后臺服務通信,但大部分時間,你只是啟動服務并讓它獨立運行。如果你需要與后臺服務通過一個持續(xù)的連接來比較頻繁地通信,建議使用bind()。比如你需要定位服務不停地把更新后的地理位置傳給UI。Binder比Intent開發(fā)起來復雜一些,但如果真的需要,你也只能使用它。 startService:生命周期與調(diào)用者不同。啟動后若調(diào)用者未調(diào)用stopService而直接退出,Service仍會運行 bindService:生命周期與調(diào)用者綁定,調(diào)用者一旦退出,Service就會調(diào)用unBind->onDestroy
7.談談你對Android中Context的理解? Context:包含上下文信息(外部值) 的一個參數(shù). Android 中的 Context 分三種,Application Context ,Activity Context ,Service Context. 它描述的是一個應用程序環(huán)境的信息,通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啟動一個Activity,發(fā)送廣播,接受Intent信息等
8.Service的onCreate回調(diào)在UI線程中嗎? Service生命周期的各個回調(diào)和其他的應用組件一樣,是跑在主線程中,會影響到你的UI操作或者阻塞主線程中的其他事情
9.請介紹下AsyncTask的內(nèi)部實現(xiàn),適用的場景是? AsyncTask內(nèi)部也是Handler機制來完成的,只不過Android提供了執(zhí)行框架來提供線程池來執(zhí)行相應地任務,因為線程池的大小問題,所以AsyncTask只應該用來執(zhí)行耗時時間較短的任務,比如HTTP請求,大規(guī)模的下載和數(shù)據(jù)庫的更改不適用于AsyncTask,因為會導致線程池堵塞,沒有線程來執(zhí)行其他的任務,導致的情形是會發(fā)生AsyncTask根本執(zhí)行不了的問題。
10.談談你對binder機制的理解? binder是一種IPC機制,進程間通訊的一種工具. Java層可以利用aidl工具來實現(xiàn)相應的接口.
11.Android中進程間通信有哪些實現(xiàn)方式? Intent,Binder(AIDL),Messenger,BroadcastReceiver
12.介紹下實現(xiàn)一個自定義view的基本流程 1、自定義View的屬性 編寫attr.xml文件 2、在layout布局文件中引用,同時引用命名空間 3、在View的構(gòu)造方法中獲得我們自定義的屬性 ,在自定義控件中進行讀取(構(gòu)造方法拿到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發(fā)出,只要沒有被消費,會一直往下傳遞,到最底層的View。 5.如果Touch事件傳遞到的每個View都不消費事件,那么Touch事件會反向向上傳遞,最終交由Activity#onTouchEvent處理. 6.onInterceptTouchEvent為ViewGroup特有,可以攔截事件. 7.Down事件到來時,如果一個View沒有消費該事件,那么后續(xù)的MOVE/UP事件都不會再給它
14.Android多線程的實現(xiàn)方式有哪些? Thread & AsyncTask Thread 可以與Loop 和 Handler 共用建立消息處理隊列 AsyncTask 可以作為線程池并行處理多任務
15.Android開發(fā)中何時使用多進程?使用多進程的好處是什么? 要想知道如何使用多進程,先要知道Android里的多進程概念。一般情況下,一個應用程序就是一個進程,這個進程名稱就是應用程序包名。我們知道進程是系統(tǒng)分配資源和調(diào)度的基本單位,所以每個進程都有自己獨立的資源和內(nèi)存空間,別的進程是不能任意訪問其他進程的內(nèi)存和資源的。 那如何讓自己的應用擁有多個進程? 很簡單,我們的四大組件在AndroidManifest文件中注冊的時候,有個屬性是android:process,1.這里可以指定組件的所處的進程。默認就是應用的主進程。指定為別的進程之后,系統(tǒng)在啟動這個組件的時候,就先創(chuàng)建(如果還沒創(chuàng)建的話)這個進程,然后再創(chuàng)建該組件。你可以重載Application類的onCreate方法,打印出它的進程名稱,就可以清楚的看見了。再設置android:process屬性時候,有個地方需要注意:如果是android:process=”:deamon”,以:開頭的名字,則表示這是一個應用程序的私有進程,否則它是一個全局進程。私有進程的進程名稱是會在冒號前自動加上包名,而全局進程則不會。一般我們都是有私有進程,很少使用全局進程。他們的具體區(qū)別不知道有沒有誰能補充一下。
2.使用多進程顯而易見的好處就是分擔主進程的內(nèi)存壓力。我們的應用越做越大,內(nèi)存越來越多,將一些獨立的組件放到不同的進程,它就不占用主進程的內(nèi)存空間了。當然還有其他好處,有心人會發(fā)現(xiàn)Android后臺進程里有很多應用是多個進程的,因為它們要常駐后臺,特別是即時通訊或者社交應用,不過現(xiàn)在多進程已經(jīng)被用爛了。典型用法是在啟動一個不可見的輕量級私有進程,在后臺收發(fā)消息,或者做一些耗時的事情,或者開機啟動這個進程,然后做監(jiān)聽等。還有就是防止主進程被殺守護進程,守護進程和主進程之間相互監(jiān)視,有一方被殺就重新啟動它。應該還有還有其他好處,這里就不多說了。
3.壞處的話,多占用了系統(tǒng)的空間,大家都這么用的話系統(tǒng)內(nèi)存很容易占滿而導致卡頓。消耗用戶的電量。應用程序架構(gòu)會變復雜,應為要處理多進程之間的通信。這里又是另外一個問題了。
16.ANR是什么?怎樣避免和解決ANR? ANR:Application Not Responding,即應用無響應 ANR一般有三種類型: 1:KeyDispatchTimeout(5 seconds) –主要類型 按鍵或觸摸事件在特定時間內(nèi)無響應
2:BroadcastTimeout(10 seconds) BroadcastReceiver在特定時間內(nèi)無法處理完成
3:ServiceTimeout(20 seconds) –小概率類型 Service在特定的時間內(nèi)無法處理完成
超時的原因一般有兩種: (1)當前的事件沒有機會得到處理(UI線程正在處理前一個事件沒有及時完成或者looper被某種原因阻塞住) (2)當前的事件正在處理,但沒有及時完成
UI線程盡量只做跟UI相關的工作,耗時的工作(數(shù)據(jù)庫操作,I/O,連接網(wǎng)絡或者其他可能阻礙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,然后判斷根據(jù)xy值,來決定是否要攔截當前操作
18.如何把一個應用設置為系統(tǒng)應用? 成為系統(tǒng)應用,首先要在 對應設備的 Android 源碼 SDK 下編譯,編譯好之后: 此 Android 設備是 Debug 版本,并且已經(jīng) root,直接將此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。 如果非 root 設備,需要編譯后重新燒寫設備鏡像即可。
有些權(quán)限(如 WRITE_SECURE_SETTINGS ),是不開放給第三方應用的,只能在對應設備源碼中編譯然后作為系統(tǒng) app 使用。
19、Android內(nèi)存泄露研究 Android內(nèi)存泄漏指的是進程中某些對象(垃圾對象)已經(jīng)沒有使用價值了,但是它們卻可以直接或間接地引用到gc roots導致無法被GC回收。無用的對象占據(jù)著內(nèi)存空間,使得實際可使用內(nèi)存變小,形象地說法就是內(nèi)存泄漏了。 場景 類的靜態(tài)變量持有大數(shù)據(jù)對象 靜態(tài)變量長期維持到大數(shù)據(jù)對象的引用,阻止垃圾回收。 非靜態(tài)內(nèi)部類的靜態(tài)實例 非靜態(tài)內(nèi)部類會維持一個到外部類實例的引用,如果非靜態(tài)內(nèi)部類的實例是靜態(tài)的,就會間接長期維持著外部類的引用,阻止被回收掉。 資源對象未關閉 資源性對象如Cursor、File、Socket,應該在使用后及時關閉。未在finally中關閉,會導致異常情況下資源對象未被釋放的隱患。 注冊對象未反注冊 未反注冊會導致觀察者列表里維持著對象的引用,阻止垃圾回收。 Handler臨時性內(nèi)存泄露 Handler通過發(fā)送Message與主線程交互,Message發(fā)出之后是存儲在MessageQueue中的,有些Message也不是馬上就被處理的。在Message中存在一個 target,是Handler的一個引用,如果Message在Queue中存在的時間越長,就會導致Handler無法被回收。如果Handler是非靜態(tài)的,則會導致Activity或者Service不會被回收。 由于AsyncTask內(nèi)部也是Handler機制,同樣存在內(nèi)存泄漏的風險。 此種內(nèi)存泄露,一般是臨時性的。
20.內(nèi)存泄露檢測有什么好方法? 檢測: 1、DDMS Heap發(fā)現(xiàn)內(nèi)存泄露 dataObject totalSize的大小,是否穩(wěn)定在一個范圍內(nèi),如果操作程序,不斷增加,說明內(nèi)存泄露 2、使用Heap Tool進行內(nèi)存快照前后對比 BlankActivity手動觸發(fā)GC進行前后對比,對象是否被及時回收
定位: 1、MAT插件打開.hprof具體定位內(nèi)存泄露: 查看histogram項,選中某一個對象,查看它的GC引用鏈,因為存在GC引用鏈的,說明無法回收 2、AndroidStudio的Allocation Tracker: 觀測到期間的內(nèi)存分配,哪些對象被創(chuàng)建,什么時候創(chuàng)建,從而準確定位


1.簡單的設計模式:單例模式:在系統(tǒng)中一個類只有一個實例。 分為懶漢模式和餓漢模式。餓漢模式的代碼如下:public class Singleten{private static singleten Instance = new Singleten();private Singleten(){}public static getInstance(){return Instance ;}}觀察者模式:一個對象改變狀態(tài),則依賴它的所有對象都會得到通知并改變狀態(tài)。迭代器模式:iterator();遍歷元素的方法有hasNext(),first(),next(),remove()模版方法
2.Listview列表效率優(yōu)化(1)利用convertview回收視圖(2)采用ViewHolder模式(3) 異步加載圖片(4) 快速滑動時不加載圖片(5) 如果自定義的item中有圖片,需要處理圖片(減少圖片所占內(nèi)存)1.對圖片進行邊界壓縮 2.用option類來保存圖片大小 3.避免圖片的實時縮放,最好預先縮放到視圖大小(6)盡量避免在listview適配器中使用線程,因為線程是產(chǎn)生內(nèi)存泄露的主要原因在于線程的生命周期不可控。
3.應用內(nèi)存優(yōu)化(1)bitmap設置圖片大小(優(yōu)化內(nèi)存溢出)BitmapFactory.Option option = new BitmapFactory.Option();option.inSampleSize = 2; //將視圖寬、高都變?yōu)樵瓉淼?/2(2)bitmap對象銷毀,可以借助recycle()方法讓GC回收bitmap對象。(3)盡量避免static成員變量引用資源消耗過多的實例,如:context(4)使用Application的context(5)及時關閉資源,如在查詢數(shù)據(jù)庫時需要及時關閉cursor(6)對經(jīng)常使用的圖片使用軟引用保存(7)線程也是造成內(nèi)存泄露的一個重要原因,在于線程的生命周期不可控制,解決方法:1.將線程內(nèi)部類改為靜態(tài)內(nèi)部類2.用弱引用來保存context引用(8)使用.9圖片
4.Handler與Handler Thread關系android消息處理機制:handler、Looper、MessageQueue、Message將一個線程變?yōu)閘ooper線程的方法: Looper.prepare; //初始化MessageQueue與LooperLooper.loop();//消息循環(huán)
5.異常處理IoException異常是編譯器異常,在編譯時就會報錯ANR異常解決方法:盡量在主線程只做少量工作,比較耗時的工作單獨在一個子線程中完成(或使用異步請求)
6.數(shù)據(jù)庫的優(yōu)化1.使用索引2.使用事務3.查詢時返回更少的結(jié)果集和字段
7.數(shù)據(jù)存儲的方法sharedpreference存儲、文件存儲、SQLite存儲、contentprovide存儲、網(wǎng)絡存儲數(shù)據(jù)
8.啟動服務的兩種方法:startservice 和bindservice使用startservice()啟動服務,調(diào)用者和服務之間沒有關聯(lián),即使調(diào)用者退出了,服務仍然運行;使用bindservice()啟動服務,調(diào)用者和服務綁定在一起,調(diào)用者一旦退出,服務也終止;采用startservice啟動服務,只能調(diào)用stopservice終止服務。
startservice()啟動服務的生命周期:oncreat()、onstart(),ondestroy() ;第一次startservice()啟動服務會調(diào)用oncreat()、onstart();后面再使用startservice()啟動服務,只會調(diào)用onstart()
bindservice()啟動服務的生命周期:oncreat()、onbind()、omunbind()、ondestroy();第一次 bindservice()啟動服務調(diào)用oncreat()、onbind(),多次調(diào)用 bindservice()并不會多次創(chuàng)建服務及綁定,如果調(diào)用者希望與正在綁定的服務解除綁定,可以調(diào)用unbindservice()方法。
8.set、List的區(qū)別:Set中元素不重復
9.contentprovide如何實現(xiàn)數(shù)據(jù)共享如果想使應用程序的數(shù)據(jù)公開化:1.自己創(chuàng)建一個contentprovide 2.將數(shù)據(jù)添加到一個已經(jīng)存在的contentprovide上如何獲取數(shù)據(jù): 外界程序可以通過contextResolver接口訪問contentprovide提供的數(shù)據(jù)contentprovide的優(yōu)點為:為其他程序提供了一個對數(shù)據(jù)訪問的接口,從而實現(xiàn)對數(shù)據(jù)進行訪問和更新的操作
10.在某個activity界面按Home鍵走的生命周期:onpause(),onstop(),onsaveinstanceState()在某個activity界面按Home鍵再點擊應用圖標走的生命周期:onRestart().onStart(),onResume()
11.在android中的4種Activity啟動模式:SingleTask、standard、SingleTop、SingleInstance
15.強引用:內(nèi)存不足時,不會回收強引用的對象軟引用:內(nèi)存不足時,會回收軟引用的對象弱引用:垃圾回收每次都會回收弱引用的對象
16.android view的刷新機制
17.靜態(tài)內(nèi)部類(1)非靜態(tài)內(nèi)部類中bunengdingy靜態(tài)成員變量和方法(2)外部類和非靜態(tài)內(nèi)部類之間可以互相訪問自己的私有成員(3)靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員


1、要做一個盡可量流暢的ListView,你可以做到的優(yōu)化手段是什么?越詳細越多手段越好
復用convertView使用ViewHolderitem中有圖片時,異步加載快速滑動時,不加載圖片item中有圖片時,應對圖片進行適當壓縮分批和分頁加載

2、繼承viewGroup后必須實現(xiàn)哪些方法,這些方法有誰調(diào)用
繼承ViewGroup后,IDE會提示提供構(gòu)造方法和實現(xiàn) onLayout()
方法。
在ViewGroup中只有一個抽象的方法 onLayout()
,所以必須實現(xiàn)它;如果執(zhí)行requestLayout()
請求重新調(diào)整位置會調(diào)用到 onLayout()

3、android 關于安全的問題,你所知道的所有的安全問題
錯誤導出組件參數(shù)校驗不嚴WebView引入各種安全問題不混淆、不防二次打包明文存儲關鍵信息錯誤使用HTTPS山寨加密方法

4、對稱加密和非對稱加密
對稱加密,就是加密和解密數(shù)據(jù)都是使用同一個key,這方面的算法有DES。 非對稱加密,加密和解密是使用不同的key。發(fā)送數(shù)據(jù)之前要先和服務端約定生成公鑰和私鑰,使用公鑰加密的數(shù)據(jù)可以用私鑰解密,反之。這方面的算法有RSA。ssh 和 ssl都是典型的非對稱加密。

5、Activity的四種launchMode
Activity一共有以下四種launchMode:
standardsingleTopsingleTasksingleInstance
我們可以在AndroidManifest.xml配置的android:launchMode屬性為以上四種之一即可。 下面我們結(jié)合實例一一介紹這四種lanchMode: 1.standard standard模式是默認的啟動模式,不用為配置android:launchMode屬性即可,當然也可以指定值為standard。standard啟動模式,不管有沒有已存在的實例,都生成新的實例。
2.singleTop 我們在上面的基礎上為指定屬性android:launchMode=”singleTop”,系統(tǒng)就會按照singleTop啟動模式處理跳轉(zhuǎn)行為。跳轉(zhuǎn)時系統(tǒng)會先在棧結(jié)構(gòu)中尋找是否有一個Activity實例正位于棧頂,如果有則不再生成新的,而是直接使用。如果系統(tǒng)發(fā)現(xiàn)存在有Activity實例,但不是位于棧頂,重新生成一個實例。 這就是singleTop啟動模式,如果發(fā)現(xiàn)有對應的Activity實例正位于棧頂,則重復利用,不再生成新的實例。
3.singleTask 如果發(fā)現(xiàn)有對應的Activity實例,則使此Activity實例之上的其他Activity實例統(tǒng)統(tǒng)出棧,使此Activity實例成為棧頂對象,顯示到幕前。
4.singleInstance 這種啟動模式比較特殊,因為它會啟用一個新的棧結(jié)構(gòu),將Acitvity放置于這個新的棧結(jié)構(gòu)中,并保證不再有其他Activity實例進入。

6、Android啟動Service的兩種方式是什么? 它們的適用情況是什么
startService:生命周期與調(diào)用者不同。啟動后若調(diào)用者未調(diào)用stopService而直接退出,Service仍會運行bindService:生命周期與調(diào)用者綁定,調(diào)用者一旦退出,Service就會調(diào)用unBind->onDestroy

7、請介紹下Android的數(shù)據(jù)存儲方式
google官方的數(shù)據(jù)存儲方式的定義共有五種:
sharedPreference內(nèi)存存儲外部存儲(其實就是文件存儲)SQlite網(wǎng)絡存儲

8、
談談你對binder機制的理解

binder是一種IPC機制,進程間通訊的一種工具.
Java層可以利用aidl工具來實現(xiàn)相應的接口.

9、ANR是什么?怎樣避免和解決ANR
ANR:Application Not Responding,即應用無響應
ANR一般有三種類型:
1: KeyDispatchTimeout(5 seconds)
–主要類型
按鍵或觸摸事件在特定時間內(nèi)無響應
2: BroadcastTimeout(10 seconds)

BroadcastReceiver在特定時間內(nèi)無法處理完成
3: ServiceTimeout(20 seconds)
–小概率類型
Service在特定的時間內(nèi)無法處理完成
超時的原因一般有兩種:
(1)當前的事件沒有機會得到處理(UI線程正在處理前一個事件沒有及時完成或者looper被某種原因阻塞住)
(2)當前的事件正在處理,但沒有及時完成
UI線程盡量只做跟UI相關的工作,耗時的工作(數(shù)據(jù)庫操作,I/O,連接網(wǎng)絡或者其他可能阻礙UI線程的操作)放入單獨的線程處理,盡量用Handler來處理UI thread和thread之間的交互。

10、你應用中的網(wǎng)絡層是怎么設計的?

用現(xiàn)成的一些框架 然后根據(jù)項目需要自己再封裝下,比如說你的交互數(shù)據(jù)是JSON格式的,你就可以用一個網(wǎng)絡請求框架+fastjson ,然后寫一些Bean 在Work線程把數(shù)據(jù)用fastjson 直接解析成對象返回,最后對一些錯誤統(tǒng)一處理
我用的是 android-async-http. 封裝了下常用的方法,get post 上傳 下載 ,所有的請求我都是用的同步請求. 具體的用法一般都是和業(yè)務邏輯在一起,而我的業(yè)務邏輯是用異步去處理的. 關于網(wǎng)絡請求結(jié)果的緩存,我是單獨處理的.并沒有放在網(wǎng)絡層.

11、android fragment和activity的區(qū)別
可以理解Fragment是一種特殊的View,負責一個模塊或者一個特殊部分的展示。大部分Fragment是依托于Activity存在的,由Activity的FragmentManager來管理Fragment可以解決多Activity的問題,即將3.0之前的頻繁Activity跳轉(zhuǎn)改成一個Activity內(nèi)Fragment的切換。Fragment可以解決碎片化的問題。
12、當ListView一直向下滑動時加載了很多圖片,這時候如果再向上滑動,怎么處理之前已經(jīng)加載好的圖片?另外,不對加載好的圖片處理的話一直向下滑會不會造成OOM
如果你用框架的話,比如Picasso,Glide,就不用管它了……
這些框架會自動回收不可見的View,所以不用擔心OOM,我極端的測試過1000張 400×272 的圖片,都沒有卡。
加載過的圖片可以緩存在有緩存容量限制的內(nèi)存中,如使用LruCache,同時也可以緩存在設置有緩存容量限制sdcard中。取圖片時統(tǒng)一先向內(nèi)存緩存中獲取,內(nèi)存緩存中獲取不到則向sdcard緩存中獲取,還是獲取不到再進行下載或讀取,獲取成功后放入緩存。以上過程均在線程中進行。 這樣在圖片不斷加載的過程中,始終能占用的內(nèi)存只有緩存上限大小,超過緩存上限的圖片將被釋放。
線程的話可以設置線程池,并設置線程池大小和執(zhí)行策略(如FILO)


1、 Android dvm的進程和Linux的進程, 應用程序的進程是否為同一個概念DVM指dalivk的虛擬機。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,所以說可以認為是同一個概念。2、sim卡的EF 文件有何作用sim卡的文件系統(tǒng)有自己規(guī)范,主要是為了和手機通訊,sim本 身可以有自己的操作系統(tǒng),EF就是作存儲并和手機通訊用的

5、一條最長的短信息約占多少byte?中文70(包括標點),英文160,160個字節(jié)。6、 android中的動畫有哪幾類,它們的特點和區(qū)別是什么?兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;另一種Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實現(xiàn),類似電影。7、handler機制的原理andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內(nèi)對象之間的消息交換(Message Exchange)。1)Looper: 一個線程可以產(chǎn)生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)。2)Handler: 你可以構(gòu)造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。3) Message Queue(消息隊列):用來存放線程放入的消息。4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。8、說說mvc模式的原理,它在android中的運用android的官方建議應用程序的開發(fā)采用mvc模式。何謂mvc?mvc是model,view,controller的縮寫,mvc包含三個部分:l模型(model)對象:是應用程序的主體部分,所有的業(yè)務邏輯都應該寫在該層。l視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。l控制器(control)對象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分,控制器更重要的一種導航功能,想用用戶出發(fā)的相關事件,交給m哦得了處理。android鼓勵弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:1)視圖層(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對android了解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當然這里需要進行java和javascript之間的通 信,幸運的是,android提供了它們之間非常方便的通信實現(xiàn)。2)控制層(controller):android的控制層的重 任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業(yè)務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。3)模型層(model):對數(shù)據(jù)庫的操作、對網(wǎng)絡等的操作都應該在model里面處理,當然對業(yè)務計算等操作也是必須放在的該層的。

14. 請介紹下Android中常用的五種布局。1、 LinearLayout – 線性布局。orientation – 容器內(nèi)元素的排列方式。vertical: 子元素們垂直排列;horizontal: 子元素們水平排列g(shù)ravity – 內(nèi)容的排列形式。常用的有 top, bottom, left, right, center 等2、 AbsoluteLayout – 絕對布局。layout_x – x 坐標。以左上角為頂點layout_y – y 坐標。以左上角為頂點3、 TableLayout – 表格式布局表格布局主要以行列的形式來管理子控件,其中每一行即一個TableRow對象,每個TableRow對象可以添加子控件,并且每加入一個空間即相當于添加了一列4、 RelativeLayout – 相對布局。layout_centerInParent – 將當前元素放置到其容器內(nèi)的水平方向和垂直方向的中央位置(類似的屬性有 :layout_centerHorizontal, layout_alignParentLeft 等)layout_marginLeft – 設置當前元素相對于其容器的左側(cè)邊緣的距離layout_below – 放置當前元素到指定的元素的下面layout_alignRight – 當前元素與指定的元素右對齊5、 FrameLayout – 層疊布局。以左上角為起點,將 FrameLayout 內(nèi)的元素一層覆蓋一層地顯示,在幀布局中,先添加的圖片會被后添加的圖片覆蓋。

15. 請介紹下Android的數(shù)據(jù)存儲方式。Android提供了5種方式存儲數(shù)據(jù):1、使用SharedPreferences存儲數(shù)據(jù);2、文件存儲數(shù)據(jù);3、SQLite數(shù)據(jù)庫存儲數(shù)據(jù);4、使用ContentProvider存儲數(shù)據(jù);5、網(wǎng)絡存儲數(shù)據(jù);Android 中的數(shù)據(jù)存儲都是私有的,其他應用程序都是無法訪問的,除非通過ContentResolver獲取其他程序共享的數(shù)據(jù)。
16. 請介紹下ContentProvider是如何實現(xiàn)數(shù)據(jù)共享的。一個程序可以通過實現(xiàn)一個Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且Content providers是以類似數(shù)據(jù)庫中表的方式將數(shù)據(jù)暴露。Content providers存儲和檢索數(shù)據(jù),通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數(shù)據(jù)的方法。要想使應用程序的數(shù)據(jù)公開化,可通過2種方法:創(chuàng)建一個屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個已經(jīng)存在的Content provider中,前提是有相同數(shù)據(jù)類型并且有寫入Content provider的權(quán)限。如何通過一套標準及統(tǒng)一的接口獲取其他應用程序暴露的數(shù)據(jù)?Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數(shù)據(jù)。
17. 如何啟用Service,如何停用Service。1.第一種是通過調(diào)用Context.startService()啟動,調(diào)用Context.stopService()結(jié)束,startService()可以傳遞參數(shù)給Service2.第二種方式是通過調(diào)用Context.bindService()啟動,調(diào)用Context.unbindservice()結(jié)束,還可以通過ServiceConnection訪問Service。在Service每一次的開啟關閉過程中,只有onStart可被多次調(diào)用(通過多次startService調(diào)用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調(diào)用一次。
19. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系。簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發(fā)和處理
25、什么情況會導致Force Close ?如何避免?能否捕獲導致其的異常?答:一般像空指針啊,可以看起logcat,然后對應到程序中 來解決錯誤

27、簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver答:一個activity呈現(xiàn)了一個用戶可以操作的可視化用戶界面一個service不包含可見的用戶界面,而是在后臺無限地運行可以連接到一個正在運行的服務中,連接后,可以通過服務中暴露出來的借口與其進行通信一個broadcast receiver是一個接收廣播消息并作出回應的component,broadcast receiver沒有界面intent:content provider在接收到ContentResolver的請求時被激活。activity, service和broadcast receiver是被稱為intents的異步消息激活的。一個intent是一個Intent對象,它保存了消息的內(nèi)容。對于activity和service來說,它指定了請求的操作名稱和待操作數(shù)據(jù)的URIIntent對象可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基于 manifest文件中的聲明)并激活它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。它是通過將Intent對象和目標的intent filter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。

35、DDMS和TraceView的區(qū)別?DDMS是一個程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器36、Activity被回收了怎么辦?只有另啟用了37、java中如何引用本地語言可以用JNI接口38、談談Android的IPC機制IPC是內(nèi)部進程通信的簡稱, 是共享”命名管道”的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中該機制,只適用于Activity和Service之間的通信,類似于遠程方法調(diào)用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實現(xiàn)IPC接口,Client端調(diào)用IPC接口本地代理。39、NDK是什么NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發(fā)者迅速的開發(fā)C/C++的動態(tài)庫,并能自動將so和java 應用打成apk包。NDK集成了交叉編譯器,并提供了相應的mk文件和隔離cpu、平臺等的差異,開發(fā)人員只需簡單的修改mk文件就可以創(chuàng)建出so40 描述一下android的系統(tǒng)架構(gòu)android系統(tǒng)架構(gòu)分從下往上為linux 內(nèi)核層、運行庫、應用程序框架層、和應用程序?qū)觢inuxkernel:負責硬件的驅(qū)動程序、網(wǎng)絡、電源、系統(tǒng)安全以及內(nèi)存管理等功能。libraries和 androidruntime:libraries:即c/c++函數(shù)庫部分,大多數(shù)都是開放源代碼的函數(shù)庫,例如webkit,該函數(shù)庫負責 android網(wǎng)頁瀏覽器的運行,例如標準的c函數(shù)庫libc、openssl、sqlite等,當然也包括支持游戲開發(fā)2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體文件格式。android的runtime負責解釋和執(zhí)行生成的dalvik格式的字節(jié)碼。applicationframework(應用軟件架構(gòu)),java應用程序開發(fā)人員主要是使用該層封裝好的api進行快速開發(fā)。applications:該層是java的應用程序?qū)樱琣ndroid內(nèi)置的googlemaps、e-mail、即時通信工具、瀏覽器、mp3播放 器等處于該層,java開發(fā)人員開發(fā)的程序也處于該層,而且和內(nèi)置的應用程序具有平等的位置,可以調(diào)用內(nèi)置的應用程序,也可以替換內(nèi)置的應用程序。上面的四個層次,下層為上層服務,上層需要下層的支持,調(diào)用下層的服務,這種嚴格分層的方式帶來的極大的穩(wěn)定性、靈活性和可擴展性,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)。android應用程序使用框架的api并在框架下運行,這就帶來了程序開發(fā)的高度一致性,另一方面也告訴我們,要想寫出優(yōu)質(zhì)高效的程序就必須對整個 applicationframework進行非常深入的理解。精通applicationframework,你就可以真正的理解android的設計 和運行機制,也就更能夠駕馭整個應用層的開發(fā)。


基礎面試題(2014-04-18)
1、請解釋下在單線程模型中Message,Handler,Message Queue,Looper之間的關系。
拿主線程來說,主線程啟動時會調(diào)用Looper.prepare()方法,會初始化一個Looper,放入Threadlocal中,接著調(diào)用Looper.loop()不斷遍歷Message Queue,
Handler的創(chuàng)建依賴與當前線程中的Looper,如果當前線程沒有Looper則必須調(diào)用Looper.prepare()。Handler , sendMessage到MessageQueue,Looper不斷
從MessageQueue中取出消息,回調(diào)handleMessage方法。

2、如果有個100M大的文件,需要上傳至服務器中,而服務器form表單最大只能上傳2M,可以用什么方法。
這個問題不是很明確我覺得,首先來說使用http協(xié)議上傳數(shù)據(jù),特別在android下,跟form沒什么關系。傳統(tǒng)的在web中,在form中寫文件上傳,其實瀏覽器所做
的就是將我們的數(shù)據(jù)進行解析組拼成字符串,以流的方式發(fā)送到服務器,且上傳文件用的都是POST方式,POST方式對大小沒什么限制。
回到題目,可以說假設每次真的只能上傳2M,那么可能我們只能把文件截斷,然后分別上傳了。

3、內(nèi)存溢出和內(nèi)存泄漏有什么區(qū)別?何時會產(chǎn)生內(nèi)存泄漏?內(nèi)存優(yōu)化有哪些方法?
內(nèi)存溢出通俗理解就是軟件(應用)運行需要的內(nèi)存,超出了它可用的最大內(nèi)存。
內(nèi)存泄漏就是我們對某一內(nèi)存空間的使用,使用完成后沒有釋放。
內(nèi)存優(yōu)化:Android中容易內(nèi)存溢出的部分,就是圖片的加載,我們可以使用圖片的壓縮加上使用LruCache緩存的目的來控制圖片所能夠使用的內(nèi)存。
還有對于比較耗資源的對象及時的關閉,例如Database Conn , 各種傳感器 , Service 等等。

4、AsyncTask使用在哪些場景?它的缺陷是什么?如何解決?
AsyncTask 運用的場景就是我們需要進行一些耗時的操作,耗時操作完成后更新主線程,或者在操作過程中對主線程的UI進行更新。
缺陷:AsyncTask中維護著一個長度為128的線程池,同時可以執(zhí)行5個工作線程,還有一個緩沖隊列,當線程池中已有128個線程,緩沖隊列已滿時,如果
此時向線程提交任務,將會拋出RejectedExecutionException。
解決:由一個控制線程來處理AsyncTask的調(diào)用判斷線程池是否滿了,如果滿了則線程睡眠否則請求AsyncTask繼續(xù)處理。

5、Activity用SharedPreferences保存數(shù)據(jù),大小有木有限制?
這個真心查不到。。。

6、Activity間通過Intent傳遞數(shù)據(jù)大小有沒有限制?
貌似是40K。

7、assest文件夾里放文件,對于文件的大小有沒有限制?22
assets目錄更像一個附錄類型的目錄,Android不會為這個目錄中的文件生成ID并保存在R類當中,因此它與Android中的一些類和方法兼容度更低。
同時,由于你需要一個字符串路徑來獲取這個目錄下的文件描述符,訪問的速度會更慢。但是把一些文件放在這個目錄下會使一些操作更加方便,
比方說拷貝一個數(shù)據(jù)庫文件到系統(tǒng)內(nèi)存中。要注意的是,你無法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問
這些文件。數(shù)據(jù)庫文件和游戲數(shù)據(jù)等放在這個目錄下是比較合適的。另外,網(wǎng)上關于assets和raw的資料都千篇一律了,因此關于這兩者中單個文件
大小不能超過1M的錯誤描述也在傳播,即如果讀取超過1M的文件會報"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的
IOException,還引申出種種解決方案。個人認為不應該有這樣的限制,為了驗證這個說法寫了個Demo,發(fā)現(xiàn)將近5M的壓縮包在assets和raw中
都能正常訪問,因此在這里糾正一下,理論上只要打包不超過Android APK 50M大小的限制都是沒有問題的。當然了,不排除是Android很早期的
時候因為設備硬件原因aapt在編譯的時候?qū)@兩個文件夾大小做出了限制,如果是這樣,較新版的ADT應該不會出現(xiàn)這種情況。
來自:http://my.eoe.cn/futurexiong/archive/5350.html

8、 啟動一個程序,可以主界面點擊圖標進入,也可以從一個程序中跳轉(zhuǎn)過去,二者有什么區(qū)別?
是因為啟動程序(主界面也是一個app),發(fā)現(xiàn)了在這個程序中存在一個設置為<category android:name="android.intent.category.LAUNCHER" />的activity,
所以這個launcher會把icon提出來,放在主界面上。當用戶點擊icon的時候,發(fā)出一個Intent:
Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent);
跳過去可以跳到任意允許的頁面,如一個程序可以下載,那么真正下載的頁面可能不是首頁(也有可能是首頁),這時還是構(gòu)造一個Intent,startActivity.
這個intent中的action可能有多種view,download都有可能。系統(tǒng)會根據(jù)第三方程序向系統(tǒng)注冊的功能,為你的Intent選擇可以打開的程序或者頁面。所以唯一的一點
不同的是從icon的點擊啟動的intent的action是相對單一的,從程序中跳轉(zhuǎn)或者啟動可能樣式更多一些。本質(zhì)是相同的。

9、程序之間的親和性的理解。
1、默認情況下一個應用的所有Activity都是具有相同的affinity,都是從application中繼承,application的affinity默認就是manifest的包名。
2、affinity對Activity來說,就像是身份證一樣,可以告訴所在的Task,自己屬于其中的一員。
3、應用場合:
a:根據(jù)affinity重新為Activity選擇合適的宿主Task;
b:與allowTaskReparenting屬性配合;
c:啟動Activity使用Intent設置了FLAG_ACTIVITY_NEW_TASK標記。

10、同一個程序,但不同的Activity是否可以放在不同的Task任務棧中?
****可以放在不同的Task中。需要為不同的activity設置不同的affinity屬性,啟動activity的Intent需要包含F(xiàn)LAG_ACTIVITY_NEW_TASK標記。


11、橫豎屏切換時候Activity的生命周期。
****1、不設置Activity的android:configChanges時,切屏會重新調(diào)用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏時只會執(zhí)行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法

12、AIDL的全稱是什么?如何工作?

全稱是:Android Interface Define Language
在Android中, 每個應用程序都可以有自己的進程. 在寫UI應用的時候, 經(jīng)常要用到Service. 在不同的進程中, 怎樣傳遞對象呢? 顯然, Java中不允許跨進程內(nèi)存共享.
因此傳遞對象, 只能把對象拆分成操作系統(tǒng)能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則
采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩。
AIDL(AndRoid接口描述語言)是一種借口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內(nèi)部通信進程的目的. 如果需要
在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個參數(shù)), 然后使用AIDL來傳遞這些參數(shù), 在消息的接收端, 使用
這些參數(shù)組裝成自己需要的對象.AIDL的IPC的機制和COM或CORBA類似, 是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現(xiàn)層間傳遞值. 如果要使用AIDL,
需要完成2件事情: 1. 引入AIDL的相關類.; 2. 調(diào)用aidl產(chǎn)生的class.
AIDL的創(chuàng)建方法:
AIDL語法很簡單,可以用來聲明一個帶一個或多個方法的接口,也可以傳遞參數(shù)和返回值。 由于遠程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.
下面是些AIDL支持的數(shù)據(jù)類型:

  1. 不需要import聲明的簡單Java編程語言類型(int,boolean等)
  2. String, CharSequence不需要特殊聲明
  3. List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡單數(shù)據(jù)類型, String等其他比支持的類型.
    (另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 或許以后會有所支持

13、dvm的進程和Linux的進程, 應用程序的進程是否為同一個概念
Dvm的進程是dalivk虛擬機進程,每個android程序都運行在自己的進程里面,每個android程序系統(tǒng)都會給他分配一個單獨的liunx uid(user id),每個dvm都是linux里面的一個進程.所以說這兩個進程是一個進程.


Activity的4種啟動模式
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式?jīng)Q定了Activity的啟動運行方式。
  Android總Activity的啟動模式分為四種:

Activity啟動模式設置:

    <activity android:name=".MainActivity" android:launchMode="standard" />

Activity的四種啟動模式:

1. standard

    模式啟動模式,每次激活Activity時都會創(chuàng)建Activity,并放入任務棧中。

2. singleTop

    如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創(chuàng)建新的實例并放入棧頂(即使棧中已經(jīng)存在該Activity實例,只要不在棧頂,都會創(chuàng)建實例)。

3. singleTask

    如果在棧中已經(jīng)有該Activity的實例,就重用該實例(會調(diào)用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中。 

4. singleInstance

    在一個新棧中創(chuàng)建該Activity實例,并讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在于某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當于多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。

其中standard是系統(tǒng)默認的啟動模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容