Android應(yīng)用程序需不需要手動退出?
不止一次,也不止一個人問過這個問題。我都回答了:不需要。但是,還是要記錄下來。
我們不妨從了解這個系統(tǒng)對于應(yīng)用程序管理的一些內(nèi)部機(jī)制開始說明原因。
對于Android系統(tǒng)而言,包含”進(jìn)程”和”服務(wù)”。”進(jìn)程”有正在運(yùn)行的,也有剛剛離開在后臺緩存的。”服務(wù)”是一個無界面、長時間運(yùn)行的應(yīng)用功能,并且不會輕易被終止。
我們知道,在Android中可以快速通過主頁鍵(home)或者使用返回鍵(←)逐步離開應(yīng)用程序。
主頁鍵:
在當(dāng)前運(yùn)行的應(yīng)用程序的任意界面,按下主頁鍵會快速回到手機(jī)主屏幕。同時這個應(yīng)用程序的進(jìn)程將在后臺被暫停并建立緩存,再次啟動應(yīng)用程序時可以方便地返回剛才的界面。(現(xiàn)場被保留)
當(dāng)然,在你按下主頁鍵回到手機(jī)主屏幕時,因設(shè)計需要,也有可能會在后臺運(yùn)行一個甚至多個進(jìn)程和服務(wù),以保證這個應(yīng)用程序在后臺是”活的”。(比如音樂正在播放時)
盡管我們知道了后臺會產(chǎn)生各種各樣的”進(jìn)程”與”服務(wù)”,但你并不用擔(dān)心它們會把你的手機(jī)拖累。當(dāng)運(yùn)行新的應(yīng)用程序發(fā)現(xiàn)內(nèi)存可能不夠用時,系統(tǒng)會自動在后臺釋放部分緩存在后臺的進(jìn)程,以保障可運(yùn)行新的應(yīng)用程序。這是一個智能的、良性的供給體系。
返回鍵:
Android系統(tǒng)使用返回鍵來進(jìn)行屏幕后退,以及關(guān)閉對話框/菜單/屏幕鍵盤。
對于傳統(tǒng)的本地客戶端應(yīng)用程序,每個屏幕可以理解為一個活動(Activity)。通過返回鍵可以快速回退到當(dāng)前應(yīng)用程序的上一個活動,也可以離開當(dāng)前應(yīng)用程序打開的新的應(yīng)用程序的某個活動。
所有的活動呈堆棧結(jié)構(gòu)(一種串行形式的數(shù)據(jù)結(jié)構(gòu)),正在運(yùn)行的活動處在最頂端。當(dāng)你按下返回鍵,會清除當(dāng)前活動并恢復(fù)上一個活動。如下面的【圖1】示例:

【圖1】
如果你連續(xù)按返回鍵,活動一個個被抽離,就像剝洋蔥一樣。
在Android的應(yīng)用程序里,可以通過”意圖(Intent)”功能,在當(dāng)前應(yīng)用程序(任務(wù))的某個活動來啟動另一個應(yīng)用程序(任務(wù))的某個活動。
比如下面的【圖2】的示例,在”有道詞典”主界面單擊超鏈接”意見反饋”打開瀏覽器訪問目標(biāo)網(wǎng)頁:

【圖2】
在目標(biāo)網(wǎng)頁界面,你可以使用返回鍵快速返回剛才的”有道詞典”主界面。
而接下來這個例子,體驗則是非常糟糕的:

【圖3】
請看【圖3】,在目標(biāo)網(wǎng)頁想要返回上一個任務(wù)需要歷經(jīng)幾番周折。一遍又一遍地回退瀏覽器的瀏覽歷史,甚至還要回到瀏覽器的起始頁,然后彈出一個對話框詢問是否要退出。天哪!我快要瘋掉了。
Android官方對于多個任務(wù)間的活動堆棧處理機(jī)制,可以看下面的【圖4】來解釋:

【圖4】
從圖中我們可以看到,一開始在后臺的”任務(wù)B”的”活動Y”經(jīng)由”任務(wù)A”的”活動2″的一個按鈕抽調(diào)到了前臺,而隨著”任務(wù)B”的活動一個個被剝離,最終整個”任務(wù)B”被結(jié)束了,并且使用返回鍵又回到了”任務(wù)A”的”活動2″。
當(dāng)然,應(yīng)用程序可以決定被調(diào)用時在哪一個活動就要結(jié)束。比如【圖4】的”任務(wù)B”被”任務(wù)A”的”活動 2″抽調(diào)到前臺后,可以決定在”活動 Y”這里就為終點,而不需讓用戶經(jīng)過”活動 Y”的上一層”活動 X”。否則,就會出現(xiàn)像【圖3】那樣的麻煩,用戶被不情愿地經(jīng)過與當(dāng)前任務(wù)無關(guān)的其它活動。
返回鍵實現(xiàn)了調(diào)用新任務(wù)之后快速返回的便利,而不是只能迂回地回到應(yīng)用程序列表并找到上一個使用的應(yīng)用程序再次啟動。
當(dāng)所有活動從堆棧中清除,任務(wù)結(jié)束。也就是說,在應(yīng)用程序的主界面按下返回鍵,應(yīng)用程序就已經(jīng)退出了。
除非,這個應(yīng)用程序設(shè)計了后臺運(yùn)行的進(jìn)程和服務(wù)。比如”新浪微博”,即使你在應(yīng)用程序主界面按下返回鍵退出了,在”程序管理”>”正在運(yùn)行”界面上仍然可以看到正在運(yùn)行的進(jìn)程和服務(wù)。(需通過菜單鍵切換至”顯示當(dāng)前運(yùn)行的服務(wù)”視圖)
正如上面提到的,后臺服務(wù)是一個無界面、長時間運(yùn)行的應(yīng)用功能,并且不會輕易被終止。即便你使用第三方的”任務(wù)管理器”來結(jié)束進(jìn)程和服務(wù),也有可能會自動重啟進(jìn)程和服務(wù)。(其實可以在”服務(wù)”界面找到它并且手動停止服務(wù),只不過沒有這個必要性,交給系統(tǒng)自動處理即可。)
至此,我們已經(jīng)知道Android應(yīng)用程序為什么不需要手動退出了。因為聰明的系統(tǒng)已經(jīng)幫助用戶做了許多事情,包括退出應(yīng)用程序以及恢復(fù)可用內(nèi)存。
受限于Android官方對設(shè)計規(guī)范的態(tài)度,Android并沒有像iOS那樣明文告訴設(shè)計者不需要這個不需要那個。Android應(yīng)用程序的設(shè)計模式也因此而”百花齊放”,很難形成較為統(tǒng)一的體驗。比如本文提到的需不需要手動退出Android應(yīng)用程序的話題,如果在iOS中看到屏幕上有退出應(yīng)用程序的按鈕,是一件搞笑的事情。
無論如何,Android也好iOS也罷,用戶本來就不需要關(guān)注”進(jìn)程”或”內(nèi)存管理”、”任務(wù)管理”這些東西。用完,離開界面即可,就這么簡單!把用戶不需要關(guān)注的問題拋給用戶,無異于”不想讓小孩玩火,但是又給他一個打火機(jī)。”
設(shè)計師們,該做些什么了。改變吧!
看到這里,也許你會問:既然Android應(yīng)用程序在后臺被掛起暫停了,但是為何開多了應(yīng)用程序手機(jī)還是會變慢呢?
一方面:新運(yùn)行的應(yīng)用程序如果需要較大的內(nèi)存,自然會比較慢。另外,如果手機(jī)本身的內(nèi)存過小且CPU不給力,系統(tǒng)自然會因較頻繁地自動結(jié)束進(jìn)程釋放緩存而導(dǎo)致手機(jī)在某些時候運(yùn)行比較慢的感覺。
也正因為這樣,我們知道了為什么”任務(wù)管理器”會如此流行,甚至成了”裝機(jī)必備”。人們用它來快速提前釋放緩存以保證運(yùn)行新應(yīng)用程序時有足夠的內(nèi)存。當(dāng)然,隨著CPU頻率越來越高,內(nèi)存越來越大的發(fā)展趨勢,手動清除緩存已經(jīng)慢慢變得不再需要。
另一方面:臨時啟動的后臺服務(wù)可能會導(dǎo)致手機(jī)變慢。有些應(yīng)用程序在后臺監(jiān)聽到指定的事件會自動啟動,比如操作系統(tǒng)本身的”Google服務(wù)”,又比如連接USB并且在PC上啟動”豌豆莢手機(jī)精靈”,手機(jī)上的”豌豆莢守護(hù)精靈”會自動啟動。為了避免這種情況,只能建議你有選擇性的安裝應(yīng)用程序了。聰明的軟件需要先進(jìn)的硬件來支持。
也許你又會問:既然在應(yīng)用程序主界面用返回鍵可以直接退出應(yīng)用程序,可是為什么某Android應(yīng)用程序(尤其是國內(nèi)的)要彈出退出確認(rèn)對話框呢?
往往他們會說是為了防止用戶誤操作,但完全是多余的考慮,因為有足夠的恢復(fù)保障。背后真正的原因其實是產(chǎn)品人不希望自己的應(yīng)用程序太容易被用戶”退出”,為此給用戶增加一道障礙墻。擔(dān)心誤操作,在我看來都是借口。
瞧瞧我們眼前的PC軟件吧!單擊窗口右上角的 X 圖標(biāo)后,也有不少軟件在干同樣的事情呢。
毫不客氣地說,這是典型的把責(zé)任推卸給用戶的做法。似乎在警告用戶:”真的要退出了?確定的話我就不管你了!”
我們應(yīng)該盡可能少使用對話框,提供必要的容錯支持。允許用戶犯錯,并給予恢復(fù)的機(jī)會。比如你可以允許用戶在按下返回鍵離開應(yīng)用程序后還能再次返回現(xiàn)場。這在很多優(yōu)秀的第三方應(yīng)用程序上均有體現(xiàn),比如Twitter、米聊……
當(dāng)然,沉浸式的應(yīng)用程序除外。比如影片正在播放或者游戲正在進(jìn)行的畫面,應(yīng)當(dāng)盡可能地不要讓用戶犯錯被退出。沉浸式的應(yīng)用程序應(yīng)當(dāng)提供沉浸式的體驗保障,因為游戲或影片進(jìn)行到一半被退出往往是無法返回現(xiàn)場的。
最后,補(bǔ)充說明:本文所說的”退出”是指退出應(yīng)用程序,而不是指退出帳戶的登錄狀態(tài)。如果你的應(yīng)用程序是需要用戶使用帳號密碼登錄的,那么提供”退出登錄”(或叫”注銷”)的功能,是有必要的。


























