編輯:關於Android編程
本文來自http://blog.csdn.net/liuxian13183/ ,引用必須注明出處!
機緣巧合寫下這篇博客,作為個人工作經驗的總結,不足之處,隨後補上。
安卓是基於Linux2.6內核的操開源作系統,安卓比Linux更智能在於:進程結束後,安卓會把程序(並非進程)保留在內存中,直到內存不夠再釋放。
在安卓看來,內存不能空著,留程序緩存在後台不會占用CPU-只保留運行狀態,二次打開更加快速-不用再次打開界面資源;所以安卓的內存在於有效利用。
系統會設置一個阈值,當系統內存低於此值時,便會按優先級來回收,一直達到另外一個穩定的阈值。優先級由低到高依次如下:
前台進程:如當前界面運行的“憤怒的小鳥”、“網易新聞”等
可見進程:如界面的Widget、輸入法和時鐘等
次要服務:如聯系人緩存、電話、Gmail內部存儲等
後台進程:按下Home鍵後的“前台進程”
Content Provider
空進程:程序退出後留下的狀態,如記錄程序的歷史信息,以便下次加載提高速度
可以給這些進程設置內存oom_adj,值越高,回收越快,也可以手動設置。推薦軟件:Auto Memory Manager
硬性回收一般是錯誤程序的回收。
程序退出並不殺死,也會觸發Android低內存管理機制(Low Memory);另外程序申請內存大於虛擬機所剩內存,會觸發Android內存不足管理機制(Out of Memory)。
AMS(Activity Manager Service)運行在獨立的虛擬機上,啟動時即注冊一個OOM Killer,當系統內存低時Linux內核會通知OOM Killer,然後根據AMS定義的級別來強制殺死應用程序。優先級如上所述。
殺死機制:優先退出優先級低的,或同優先級但內存占用大的程序
經驗示例1:
Bitmapbitmap = null;
try {
// 實例化Bitmap
bitmap= BitmapFactory.decodeFile(path);
}catch(OutOfMemoryError e) {
}
if(bitmap == null) {
// 如果實例化失敗返回默認的Bitmap對象
return defaultBitmapMap;
}
這裡對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲,由於OOM是error而非Exception,防止內存溢出錯誤不能捕獲。
經驗示例2:
BitmapFactory.Optionsopts = new BitmapFactory.Options();
// 設置inJustDecodeBounds為true
opts.inJustDecodeBounds= true;
// 使用decodeFile方法得到圖片的寬和高
BitmapFactory.decodeFile(path,opts);
// 打印出圖片的寬和高
Log.d("example",opts.outWidth + "," + opts.outHeight);
系統API提示:需要縮小圖片時,通過此方法可以獲得圖片的寬和高,不會給圖片分配內存,然後再設置opts.inJustDecodeBounds為false即可。
TextSwitcher的Java Doc是這樣描述自己的: Specialized ViewSwitcher that contains only children o
前言:Vibrator簡介: 下面我們就來寫個簡單的例子,來熟悉下這個Vibrator的用法!1.獲得Vibrator實例:Vibrator vb = (Vib
在前面的博文中,小編簡單的介紹了如何制作圓角的按鈕以及圓角的圖片,伴著鍵盤和手指之間的舞步,迎來新的問題,不知道小伙伴有沒有這樣的經歷,以App為例,點擊頭像的時候,會從
Android UI工具包提供了一些布局管理器,它們使用起來相當容易,而且,大多數的時候,你只需要使用它們最基本的特征來實現UI。執著於基本特征的使用對於創建UI來說,往