1. 程式人生 > >Android安全/開發基礎--14--其他理論知識

Android安全/開發基礎--14--其他理論知識

13-1、Material Design

Material Design是谷歌基於傳統優秀的設計原則,結合豐富的創意和科學技術所發明的一套全新的介面設計語言,包括了視覺、運動、互動效果等特性。2015年穀歌推出支援庫。

material design強調以下三大設計原則

實體隱喻(擬物化):應用部件應具有實物感。 醒目、形象、有目的性:如設計精良的雜誌帶來的體驗一樣,應用設計元素也應有如此觀感。 動畫要有表現力:應用應能動態響應使用者操作。

13-2、Android中的快取(Cache)策略

常見的快取演算法是LRU(Least Recently Used),LRU是近期最少使用演算法,核心思想是當快取滿時,會優先淘汰那些近期最少使用的快取物件。採用LRU演算法的快取有兩種:LruCache和DiskLruCache,LruCache用於實現記憶體快取,而DiskLruCache則充當儲存裝置快取,通過二者完美結合,即可實現ImageLoader。

ImageLoader是Android的圖片載入框架

它的目的:是為了實現非同步的網路圖片載入、快取及顯示,支援多執行緒非同步載入。

它的工作原理是:在顯示圖片的時候,優先在記憶體中查詢,如果沒有就去本地查詢,如果還沒有就開一個新的執行緒去下載這張圖片,下載成功會把圖片同時快取到記憶體和本地。

一個優秀的ImageLoader應該具備如下功能:圖片的同步載入、圖片的非同步載入、圖片壓縮、記憶體快取、磁碟快取、網路垃圾。

優化列表的卡頓現象:首先不要在getView中執行耗時操作,其次控制非同步任務的執行頻率。

ImageLoader的三大元件:

ImageLoaderConfiguration:對圖片快取進行總體配置,包括記憶體快取的大小、本地快取的大小和位置、日誌、下載策略(FIFO還是LIFO)等等。

ImageLoader:一般使用displayImage來把URL對應的圖片顯示在ImageView上。

ImageLoaderOptions:在每個頁面需要顯示圖片的地方控制如何顯示的細節,比如指定下載時的預設圖(包括下載中、下載失敗、URL為空等),是否將快取放到記憶體或者本地磁碟。

13-3、方法數越界

在Android中,整個應用的方法數限制為不能超過65536,這包含Android FrameWork、依賴的jar包以及應用本身的程式碼中的所有方法。超過就會出現編譯錯誤,並且將無法安裝在手機上。解決方案有兩種:

multidex:它通過將一個dex檔案拆分為多個dex檔案來避免單個dex檔案方法數越界的問題。系統預設支援multidex,但需要在Gradle中配置,具體實現過程不細究。採用該方案也會使應用啟動速度降低。

動態載入:它可以直接載入一個dex形式的檔案,將部分程式碼打包到一個單獨的dex檔案中,並在程式執行時根據需要動態載入dex中的類,如此也可以解決方法數越界問題。

當專案日益龐大的時候,需要通過外掛化來減輕應用的記憶體和CPU佔用,還可以實現熱插拔,即在不釋出新版本的情況下更新某些模組。不同外掛化方案都要解決的基礎性問題:資源訪問、Activity生命週期的管理、ClassLoader的管理。

13-4、C/C++中操作Java中的基本型別陣列

1、GetArrayElements方法

Get<Type>ArrayElements(<Type>Array arr , jboolean* isCopide)
這類函式可以把Java基本型別的陣列轉換到C/C++中的陣列。

2、ReleaseArrayElements方法

Release<Type>ArrayElements(<Type>Array arr , <Type>* array , jint mode)
用這個函式可以選擇如何處理Java和C/C++的陣列,如提交、撤銷、記憶體釋放等。

3、GetprimittiveArrayCritical方法

GetprimittiveArrayCritical(jarray arr , jboolean* isCopied)

4、ReleaseprimittiveArrayCritical方法

ReleaseprimittiveArrayCritical(jarray arr , void* array , jint mode)
該函式可直接傳回指向Java陣列的指標,存在死鎖問題。

5、Get<Type>ArrayRegion方法

Get<Type>ArrayRegion(<Type>Array arr , jsize start , jsize len , <Type>*  buffer)
把Java基本型別的陣列拷貝到C/C++預先開闢的一段記憶體中。

6、Set<Type>ArrayRegion方法

Set<Type>ArrayRegion(<Type>Array arr , jsize start , jsize len , const <Type>*  buffer)
把Java基本型別陣列中的指定範圍的元素用C/C++陣列中的元素來賦值。

7、<Type>ArrayNew方法

<Type>ArrayNew<Type>Array(jsize sz)
指定一個長度然後返回相應的Java基本型別的陣列。