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