一、Android中的底層圖形類:android.graphics提供接口。
1.drawable:通用的圖形對象,用於裝載常用格式的圖像。我們可以理解成一個用來放畫的---畫框。
2.Bitmap:(位圖)我們可以把它看做一個畫架。
3.canvas:畫布。
二、Bitmap引起的OOM問題:
OutOfMemory(內存溢出)。Android會爲每個App分配一個獨立的工作空間,或者說分配一個單獨的dalvik虛擬機,這樣每個App可以相互獨立運行而不互相影響。
避免BItmap引起的OOM:
(1)採用低內存佔用量的編碼方式:比如Bitmap.Config.ARGB_8888(8位,一個像素佔四個字節)是默認值,我們可以修改成Bitmap.Config.ARGB_4444(4位,佔兩個字節)。
(2)圖片壓縮:
(3)及時回收圖像。
(4)通過softReference引用方式管理圖片資源。
我們可以這樣定義:map裏面的鍵是用來放圖片地址的,既可以使網絡圖片地址,也可以使sdcard圖片地址,map裏面的值是持有軟引用的Bitmap。
Map<String,SoftReference<Bitmap>>
如何具體加載圖片:步驟:(1)先通過URL查看緩存中是否有圖片,如果有,則直接去緩存中取得,如果沒有,則開線程重新去網絡加載。
(2)下載完了之後,就把圖片放在緩存裏面,方便下次可以直接從緩存中取得。
(5)內存緩存技術:在Android中,有一個叫做LruCache類專門用來做圖片緩存處理的。
它有一個特點:當緩存的圖片達到了預先設定的值得時候,那麼近期使用次數最少的圖片就會被回收掉。
步驟:(1)要先設置緩存圖片的內存大小,一般設置手機內存的1/8.
手機內存的獲取方式:int MaxMemory = (int)(Runtime.getRuntime().maxMemory()/1024);
(2)LruCache裏面的鍵值對分別是URL和對應的圖片。
(3)重寫了一個叫做sizeOf的方法,返回的是圖片數量。
(4)分別有清空緩存,添加圖片到緩存,從緩存中取得圖片,從緩存中移除圖片。移除和清除緩存是必須要做的事情,因爲圖片緩存處理不當就會引起OOM。
clearCache(),addBitmapToMemory(),getBitmapFromMEMCache(),removeIamgeCache()。
二、Service的onStartCommand()方法有幾種返回值?
答:四種。
(1)start_Stiky:如果service進程被kill掉,保留service的狀態爲開始狀態,但不保留遞送的intent對象。系統會嘗試重新創建該服務。
(2)start_Not_Stiky:非粘性的,系統不會自動重啓該服務。
(3)start_deleliver_intent:重傳Intent,系統會自動重啓該服務,並將Intent的值傳入。
(4)start_stiky_compatibility:不保證服務被kill後一定能重啓。
三、如何讓自己的廣播只讓自己指定的app接收?
(1)自己的應用(A)在發送廣播的時候給自己發送的廣播自定義權限,然後在AndroidManifest中聲明。
(2)其他應用(B)如果想要接收該廣播,那麼就必須知道應用A廣播使用的權限。然後在應用B的清單文件中配置。
四、爲什麼要用ContentProvider,它和SQL有什麼區別?
答:ContentProvider屏蔽了數據存儲的細節,內部實現對用戶完全透明,用戶只需要關心操作數據的uri就可以了,ContentProvider可以實現不同app之間數據共享。
SQL也有正刪改查的方法,但是SQL只能查詢本應用下的數據庫,而contentProvider還可以增刪改查本地文件,XML文件的讀取等。
五、Android中佈局的優化措施:
(1)儘可能減少佈局的嵌套層級。
(2)不用設置不必要的背景,避免過度繪製。
(3)使用include標籤複用相同的佈局代碼。
(4)使用merge標籤減少視圖層級結構。
(5)通過viewStub實現View的延遲加載。
六、android:layout_gravity和android:gravity的區別?
第一個是讓該佈局在其父控件中的佈局方式,第二個是該佈局佈置其字對象的佈局方式。
七、ListView如何提高其效率?
(1)複用ConvertView。
(2)自定義靜態類ViewHolder。
(3)使用分頁加載。
(4)使用WeakReference引用ImageView對象。
八、當ListView數據集改變後,如何更新ListView?
使用該ListView的adapter的notifyDataSetChanged()方法。該方法會使ListView重新繪製。
九、ListView如何實現分頁加載?
(1)設置ListView的滾動監聽器:setOnScrolListener(new OnScrollListener{......})
在監聽器中有兩個方法:滾動狀態發生變化的方法(onScrollStateChanged)和ListView被滾動時調用的方法(onScroll)。
(2)在滾動狀態發生改變的方法中,有三種狀態:
手指按下移動的狀態:SCROLL_STATE_TOUCH_SCROLL;//觸摸滑動
慣性滑動:SCROL_STATE_FLING;//滑翔
靜止狀態:SCROLL_STATE_IDLE;靜止
對不同的狀態進行處理:
分批加載數據,只關心靜止狀態:關心最後一個可見的條目,如果最後一個可見條目就是數據適配器(集合)裏的最後一個,此時可加載更多的數據。
在每次加載的時候,計算出滾動的數量,當滾動的數量大於總數量的時候,可以提示用戶無更多數據了。
十、ListView顯示多種類型的條目:
ListView顯示的每個條目都是通過baseAdapter的getView來展示的,理論上我們可以讓每個條目都是不同類型的view,除此之外,adapter還提供了getviewtypeCount()和
getItemViewType()兩個方法,在getView方法中我們可以根據不同的ViewType加載不同的佈局文件。
十一、ListView如何定位到指定位置?
可以通過ListView提供的lv.setSelection()方法。
十二、ListView中如何優化圖片?
答:1.處理圖片的方式:(1)使用options保存圖片大小,不要加載圖片到內存中去。
(2)對圖片一定要經過圖片壓縮尤其是比較大的圖片。
(3)WeakReference保存圖片。
(4)在getView中做圖片轉換時,產生的中間變量一定及時釋放。
2.異步加載圖片基本思想。
(1)先從內存中獲取圖片顯示(內存緩衝)。
(2)獲取不到的話從SD卡里面獲取(SD卡緩衝)。
(3)都獲取不到的話從網絡下載圖片並保存到SD卡同時加入內存並顯示(視情況看是否要顯示)。
原理:優化一:先從內存中加載,沒有則開啓線程從SD卡或網絡中獲取,這裏注意從SD卡獲取圖片是放在子線程裏執行的,
否則快速滑屏的話會不夠流暢。
優化二、與此同時,在adapter裏會有個busy變量,表示listview是否處於滑動狀態,如果是滑動狀態則僅從內存中獲取圖片,沒有的話無需再開啓線程去外存或網絡獲取圖片。
優化三、ImageLoader裏的線程使用了線程池,從而避免了過多線程頻繁創建和銷燬。在從網絡獲取圖片時,先是將其保存到sd卡,然後再加載到內存,這麼做的好處是在加載到內存時可以做個壓縮處理,以減少圖片所佔內存。
十三、ListView中圖片錯位的問題是如何產生的?
圖片錯位問題的本質源於我們的listView使用了緩存convertView,假設一種場景,一個listview一屏顯示九個item,那麼在拉出第十個item的時候,事實上該item是重複使用了
第一個item,也就是說在第一個item在從網絡中下載圖片並最終要顯示的時候,其實該item已經不在當前顯示區域了,此時顯示的後果將可能在第十個item上輸出圖像,這就導致了圖片錯位的問題。所以解決之道在於可見則顯示,不可見則不顯示。
十四、scrollView嵌套listview方式除了測量還有什麼辦法?
1.手動代碼設置listView高度。
動態設置listview高度。
2.自定義可適應的scrollView的listView。
自定義一個類繼承自ListView,通過重寫其onMeasure方法達到對scrollView適配的效果。
十五、JNI&NDK
1.在Android中如何調用C語言?
JNI的方式,Java Native Interface。在Android開發目錄的libs目錄下添加xxx.so文件。在Java代碼需要通過System.loadLibrary(libName);加載so文件。同時C語言中的方法在Java中必須以native關鍵字來聲明。普通Java方法調用這個native方法接口,虛擬機內部自動調用C文件中對應的方法。
2.請介紹一下NDK?
(1)NDK是一系列工具的集合。NDK提供了一系列的工具,幫助開發者快速開發C或C++的動態庫,並能自動將so和Java應用一起打包成apk。
(2)NDK提供了一份穩定,功能有限的API頭文件聲明。
3.JNI調用兩個常用的參數:
第一個是指向虛擬機對象的指針,是一個二級指針。裏面封裝了很多方法和二級變量供我們使用。
第二個代表着調用該方法的Java對象的C語言表示。
十六、Fragment的add和replace方法的區別?
fragment本身並沒有add和replace方法,這裏應該理解爲fragmentManager的replace和add方法切換Fragment時有什麼不同。
add方法添加fragment要結合hide和show方法使用。將要顯示的show出來,不顯示的hide起來。這個過程Fragment的生命週期無變化。
通過replace切換fragment,每次都會執行上一個fragment的onDestroyView,新Fragment的onCreateView,onStart,onResume方法。
十七、什麼情況下會導致內存泄漏?
內存溢出的幾點原因:
1.資源釋放問題。
長期保持某些資源,如Context,Cursor,IO流的引用,資源得不到釋放。
2.對象內存過大問題。
3.static關鍵字的使用問題。
4.線程導致內存溢出。
十八、Android中如何捕獲未捕獲的異常?
1.自定義一個Application,比如MyApplication繼承Application實現UnCaughtExceptionHandler.
2.覆寫UNCaughtExceptionHandler的onCreate和UNCaughtException方法。
3.在AndroidManifest中配置該Application。
十九、Android中屏幕適配:
1.dp.
2.dimens
3.layout
4.weight
5.java代碼適配
6.儘量使用線性佈局,相對佈局