欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂教你Android內(nèi)存管理(二)

2018-08-09 14:39:52 1530瀏覽

Android是一個基于Linux實現(xiàn)的操作系統(tǒng)。但對于Linux內(nèi)核來說,Android也僅僅只是一個運行在內(nèi)核之上的應(yīng)用程序,與其他運行在內(nèi)核之上的應(yīng)用程序沒有任何區(qū)別。所以Android需要一套機制管理運行在Linux進程中的APK應(yīng)用程序。很多參加Android培訓(xùn)的同學(xué)也需要知道這個知識點。Android內(nèi)存管理包含兩部分,一部分是Framework對內(nèi)存的管理,一部分是Linux內(nèi)核對內(nèi)存管理,這兩部分共同決定應(yīng)用程序的生命周期。本文主要闡述Android內(nèi)存管理機制的實現(xiàn)原理,以及在應(yīng)用開發(fā)中需要注意的一些事項,最后文章總結(jié)了如何實現(xiàn)殺不死進程的一種方法。本文分為兩部分閱讀。這是本文的第二部分。

Android系統(tǒng)試圖盡可能長時間地保持應(yīng)用程序進程,但為了新建或者運行更加重要的進程,總是需要清除過時進程來回收內(nèi)存。為了決定保留或終止哪個進程,根據(jù)進程內(nèi)運行的組件及這些組件的狀態(tài),系統(tǒng)把每個進程都劃入一個“重要性層次結(jié)構(gòu)”中。重要性最低的進程首先會被清除,然后是下一個最低的,依此類推。

重要性層次結(jié)構(gòu)共有5級,以下列表按照重要程度列出了各類進程(第一類進程是最重要的,將最后一個被終止):

1)前臺進程

用戶當前操作所必須的進程。滿足以下任一條件時,進程被視作處于前臺:

其中運行著正與用戶交互的Activity(Activity對象的onResume()方法已被調(diào)用)。

其中運行著與用戶交互的activity綁定的Service。

其中運行著前臺Service,既該Service以startForeground()方式被調(diào)用。

其中運行著正在執(zhí)行生命周期回調(diào)方法(onCreate()、onStart()或onDestory())的Service。

其中運行著正在執(zhí)行onReceive()方法的BroadcastReceiver。

一般而言,任何時刻前臺進程的數(shù)量都為數(shù)不多,只有當內(nèi)存不足以維持它們同時運行時才會被終止。通常,設(shè)備這時候已經(jīng)到了使用虛擬內(nèi)存的地步,終止一些前臺進程是為了保證用戶界面的及時響應(yīng)。

2)可見進程

沒有前臺組件、但仍會影響用戶在屏幕上所見內(nèi)容的進程。滿足以下任一條件時,進程被認為是可見的:

其中運行著非前臺Activity,但用戶仍然可見到此activity(onPause()方法被調(diào)用)。例如,打開了一個對話框,而activity還允許顯示在對話框后面,對用戶依然可見。

其中運行著被可見(或前臺)activity綁定的Service。

可見進程被認為是非常重要的進程,除非無法維持所有前臺進程同時運行了,否則它們是不會被終止的。

3)服務(wù)進程

此進程運行著由startService()方法啟動的服務(wù),它不會升級為前臺進程或可見進程。盡管服務(wù)進程不直接和用戶所見內(nèi)容關(guān)聯(lián),但他們通常在執(zhí)行一些用戶關(guān)心的操作(比如在后臺播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺、可見進程同時運行,系統(tǒng)會保持服務(wù)進程的運行。

4)后臺進程

包含用戶不可見activity(Activity對象的onStop()方法已被調(diào)用)的進程。這些進程對用戶體驗沒有直接的影響,系統(tǒng)可能在任意時間終止它們,以回收內(nèi)存供前臺進程、可見進程及服務(wù)進程使用。

通常系統(tǒng)會有很多后臺進程在運行,所以它們被保存在一個LRU(最近最少使用)列表中,以確保最近被用戶使用的activity最后一個被終止。如果一個activity正確實現(xiàn)了生命周期方法,并保存了當前的狀態(tài),則終止此類進程不會對用戶體驗產(chǎn)生可見的影響。因為在用戶返回時,activity會恢復(fù)所有可見的狀態(tài)。關(guān)于保存和恢復(fù)狀態(tài)的詳細信息,請參閱Activity文檔。

5)空進程

不含任何活動應(yīng)用程序組件的進程。保留這種進程的唯一目的就是用作緩存,以改善下次在此進程中運行組件的啟動時間。為了在進程緩存和內(nèi)核緩存間平衡系統(tǒng)整體資源,系統(tǒng)經(jīng)常會終止這種進程。

依據(jù)進程中目前活躍組件的重要程度,Android會給進程評估一個盡可能高的級別。例如,如果一個進程中運行著一個服務(wù)和一個用戶可見的activity,則此進程會被評定為可見進程,而不是服務(wù)進程。

此外,一個進程的級別可能會由于其它進程的依賴而被提高——為其它進程提供服務(wù)的進程級別永遠不會低于使用此服務(wù)的進程。比如:如果A進程中的contentprovider為進程B中的客戶端提供服務(wù),或進程A中的服務(wù)被進程B中的組件所調(diào)用,則A進程至少被視為與進程B同樣重要。

因為運行服務(wù)的進程級別是高于后臺activity進程的,所以,如果activity需要啟動一個長時間運行的操作,則為其啟動一個服務(wù)會比簡單地創(chuàng)建一個工作線程更好些——尤其是該操作時間比activity的生存期還要長的情況下。比如,一個activity要把圖片上傳至Web網(wǎng)站,就應(yīng)該創(chuàng)建一個服務(wù)來執(zhí)行之,即使用戶離開了此activity,上傳還是會在后臺繼續(xù)運行。不論activity發(fā)生什么情況,使用服務(wù)可以保證操作至少擁有“服務(wù)進程”的優(yōu)先級。同理,廣播接收器broadcastreceiver也是使用服務(wù)來處理耗時任務(wù)的,而不是簡單地把它放入線程中。

殺不死的Service

如何讓應(yīng)用在手機中存活更長時間?網(wǎng)上各種方法可謂是千奇百怪,有些簡直異想天開。

系統(tǒng)廣播喚醒應(yīng)用,比如手機開機,網(wǎng)絡(luò)切換等

接入第三方SDK喚醒應(yīng)用,比如接入微信SDK會喚醒微信

免殺白名單,比如360免殺白名單,MIUI系統(tǒng)免殺白名單

全家桶,應(yīng)用之間互相喚醒,比如百度系,阿里系應(yīng)用

兩個Service互相喚醒(這個就別想了,不靠譜)

使用Timer定時器(一樣不靠譜)

設(shè)計良好的應(yīng)用不應(yīng)該在用戶不使用的時候依然保持運行。一直在后臺運行不光費電費流量,還是造成系統(tǒng)卡頓的主要原因之一(參見上文分析)。正常的做法是優(yōu)化你的應(yīng)用程序,減少不合理場景的情況,除一些必要服務(wù)應(yīng)用外,大部分應(yīng)用不需要一直在后臺保存運行狀態(tài)。

有正常的做法就有不正常的做法,讓應(yīng)用長時間停留在用戶手機中無外乎就是增加所謂的活躍用戶數(shù)等一些產(chǎn)品指標。這對于很多公司還是很有吸引力的。

如上文所說,無論應(yīng)用怎么掙扎,當處于不可見進程的情況下隨時都有可能被殺死。所以使用前臺進程是最有效的方法。但前臺進程必須有一個Notifcation顯示在通知欄中,有沒有辦法讓應(yīng)用以前臺進程的方式啟動同時又不顯示Notifcation?方法當然有,就是利用系統(tǒng)漏洞:

API<18,啟動前臺Service時直接傳入newNotifcation();

API>=18,同時啟動兩個id相同的前臺Service,然后再將后啟動的Service做stop處理

目前,QQ,微信,支付寶等知名應(yīng)用都使用此方案。不過如果應(yīng)用占用太多內(nèi)存即使是前臺進程也依然會被干掉。

這些所謂的實現(xiàn)進程殺不死的方案并不都是一勞永逸的方法,以犧牲用戶體驗為代價很有可能會激怒用戶卸載你的應(yīng)用,所以最好的方式還是遵循Android規(guī)范開發(fā)性能更優(yōu)更合理的應(yīng)用程序。



以上這篇就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持扣丁學(xué)堂,想要了解更多詳情請登錄扣丁學(xué)堂官網(wǎng)咨詢或者關(guān)注微信公眾號,里面有最新的扣丁學(xué)堂Android視頻教程等你來看!

【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】

 

 

       查看更多關(guān)于“Android開發(fā)技術(shù)”的相關(guān)資訊>>


標簽: android在線視頻 android培訓(xùn)視頻 android入門操作

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部