Android基礎知識複習

一、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.儘量使用線性佈局,相對佈局


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章