編輯:關於Android編程
Android系統想要永久的保留一個應用進程幾乎是不可能的,所以系統就需要不斷的釋放老的或者不太重要的進程以便騰出足夠的內存空間來運行新的或者更重要的進程,那麼系統如何決定哪個進程應該保留哪個應該殺死呢,原來系統會根據進程中運行組件以及他們的狀態列出一個“重要層級”,當內存出現緊張的時候,系統會首先殺死最不重要的進程,接著是第二個,第三個。。。,以此類推來不斷的釋放系統資源直到內存不再緊張為止。
根據這個重要層級系統把進程分為了5個級別,下面要說的就是這五種不同的進程類型:
1、foreground process
此進程類型需要知道用戶當前正在做什麼,滿足一下任意條件即可認為是foreground process:
(1)正處於activity resume狀態
(2)正處於bound服務交互的狀態
(3)正處於服務在前台運行的狀態(StartForeGround()被調用)
(4)Service生命周期正在被執行(onCreate(),onStart(),onDestroy())
(5)BroadcastReceiver正在執行onReceive()方法
殺死foreground需要用戶響應,因為這個安全優先級是最高的是用戶操作所必須的,任一時間下,僅有少數進程會處於前台,僅當內存實在無法供給它們維持同時運行時才會被殺死。一般來說,在這種情況下,設備依然處於使用虛擬內存的狀態,必須要殺死一些前台進程以用戶界面保持響應。
Android會依據進程中當前活躍組件的重要程度來盡可能高的估量一個進程的級別。比如說,如果一個進程中同時有一個服務和一個可視的activity,則進程會被判定為可視進程,而不是服務進程。
2、visible process
(1)activity不在前端顯示,但也沒有完全隱藏,能夠看得見,比如彈出一個對話框
(2)一個bound到visible或者foreground的activity的service
沒有前台組件,但仍可被用戶在屏幕上所見。當滿足如下任一條件時,進程被認為是可視的:
? 它包含著一個不在前台,但仍然為用戶可見的activity(它的onPause()方法被調用)。這種情況可能出現在以下情況:比如說,前台activity是一個對話框,而之前的activity位於其下並可以看到。
? 它包含了一個綁定至一個可視的activity的服務。
可視進程依然被視為是很重要的,非到不殺死它們便無法維持前台進程運行時,才會被殺死。
3、Service process
正在運行的,不在上述兩種狀態的service。是由 startService() 方法啟動的服務,它不會變成上述兩類。盡管服務進程不會直接為用戶所見,但它們一般都在做著用戶所關心的事情(比如在後台播放mp3或者從網上下載東 西)。所以系統會盡量維持它們的運行,除非系統內存不足以維持前台進程和可視進程的運行需要。
4、background process
不可見狀態的activity進程,onstop被調用。
包含目前不為用戶所見的activity(Activity對象的 onStop() 方法已被調用)。這些進程與用戶體驗沒有直接的聯系,可以在任意時間被殺死以回收內存供前台進程、可視進程以及服務進程使用。一般來說,會有很多背景進程 運行,所以它們一般存放於一個LRU(最後使用)列表中以確保最後被用戶使用的activity最後被殺死。如果一個activity正確的實現了生命周 期方法,並捕獲了正確的狀態,則殺死它的進程對用戶體驗不會有任何不良影響。
5、empty process
沒有運行任何component的進程,保留這個進程主要是為了緩存的需要
不包含任何活動應用程序組件。這種進程存在的唯一原因是做為緩存以改善組件再次於其中運行時的啟動時間。系統經常會殺死這種進程以保持進程緩存和系統內核緩存之間的平衡。
此外,一個進程的級別可能會由於其它進程依賴於它而升高。一個為其它進程提供 服務的進程級別永遠高於使用它服務的進程。比如說,如果A進程中的內容提供者為進程B中的客戶端提供服務,或進程A中的服務為進程B中的組件所綁定,則A 進程最低也會被視為與進程B擁有同樣的重要性。
歡迎大家來學習本節內容,前幾節我們已經學習了其他幾種自定義控件,分別是Andriod 自定義控件之音頻條及 Andriod 自定義控件之創建可以復用的組合控件還沒有學習的
原始圖效果 模仿效果PNGGIF 流程繪制中心線,用於計算外層多邊形各點的坐標 繪制最外層多邊形 分析原型圖算出每個多邊形之間的間距 繪制裡三層多邊形
在Android開發中我們常常用到圓形的頭像,如果每次加載之後再進行圓形裁剪特別麻煩。所以在這裡寫一個自定義圓形ImageView,直接去加載網絡圖片,這樣的話就特別的方
注:本文是我早些時候在eoe上發布的一篇文章 由於每個應用程序都運行在自己的進程空間,並且可以從應用程序UI運行另一個服務進程,而且經常會在不同的進程間傳遞對象