不止一次,也不止一個人問過這個問題。我都回答了:不需要。但是,還是要記錄下來。
我們不妨從了解這個系統對於應用程序管理的一些內部機制開始說明原因。
對於Android系統而言,包含“進程”和“服務”。“進程”有正在運行的,也有剛剛離開在後台緩存的。“服務”是一個無界面、長時間運行的應用功能,並且不會輕易被終止。
我們知道,在Android中可以快速通過主頁鍵(home)或者使用返回鍵(←)逐步離開應用程序。
主頁鍵:
在當前運行的應用程序的任意界面,按下主頁鍵會快速回到手機主屏幕。同時這個應用程序的進程將在後台被暫停並建立緩存,再次啟動應用程序時可以方便地返回剛才的界面。(現場被保留)
當然,在你按下主頁鍵回到手機主屏幕時,因設計需要,也有可能會在後台運行一個甚至多個進程和服務,以保證這個應用程序在後台是“活的”。
盡管我們知道了後台會產生各種各樣的“進程”與“服務”,但你並不用擔心它們會把你的手機拖累。當運行新的應用程序發現內存可能不夠用時,系統會自動在後台釋放部分緩存在後台的進程,以保障可運行新的應用程序。這是一個智能的、良性的供給體系。
返回鍵:
Android系統使用返回鍵來進行屏幕後退,以及關閉對話框/菜單/屏幕鍵盤。
對於傳統的本地客戶端應用程序,每個屏幕可以理解為一個活動(Activity)。通過返回鍵可以快速回退到當前應用程序的上一個活動,也可以離開當前應用程序打開的新的應用程序的某個活動。
所有的活動呈堆棧結構(一種串行形式的數據結構),正在運行的活動處在最頂端。當你按下返回鍵,會清除當前活動並恢復上一個活動。如下面的【圖1】示例:
【圖1】(來源:http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html )
如果你連續按返回鍵,活動一個個被抽離,就像剝洋蔥一樣。
在Android的應用程序裡,可以通過“意圖(Intent)”功能,在當前應用程序(任務)的某個活動來啟動另一個應用程序(任務)的某個活動。
比如下面的【圖2】的示例,在“有道詞典”主界面單擊超鏈接“意見反饋”打開浏覽器訪問目標網頁:
【圖2】
在目標網頁界面,你可以使用返回鍵快速返回剛才的“有道詞典”主界面。
而接下來這個例子,體驗則是非常糟糕的:
【圖3】
請看【圖3】,在目標網頁想要返回上一個任務需要歷經幾番周折。一遍又一遍地回退浏覽器的浏覽歷史,甚至還要回到浏覽器的起始頁,然後彈出一個對話框詢問是否要退出。天哪!我快要瘋掉了。
Android官方對於多個任務間的活動堆棧處理機制,可以看下面的【圖4】來解釋:
【圖4】(來源:http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html )
從圖中我們可以看到,一開始在後台的“任務B”的“活動Y”經由“任務A”的“活動2”的一個按鈕抽調到了前台,而隨著“任務B”的活動一個個被剝離,最終整個“任務B”被結束了,並且使用返回鍵又回到了“任務A”的“活動2”。
當然,應用程序可以決定被調用時在哪一個活動就要結束。比如【圖4】的“任務B”被“任務A”的“活動 2”抽調到前台後,可以決定在“活動 Y”這裡就為終點,而不需讓用戶經過“活動 Y”的上一層“活動 X”。否則,就會出現像【圖3】那樣的麻煩,用戶被不情願地經過與當前任務無關的其它活動。
返回鍵實現了調用新任務之後快速返回的便利,而不是只能迂回地回到應用程序列表並找到上一個使用的應用程序再次啟動。
當所有活動從堆棧中清除,任務結束。也就是說,在應用程序的主界面按下返回鍵時,應用程序就已經退出了。
除非,這個應用程序設計了後台運行的進程和服務。比如"新浪微博",即使你在應用程序主界面按下返回鍵退出了,在“程序管理”>“正在運行”界面上仍然可以看到正在運行的進程和服務。(需通過菜單鍵切換至“顯示當前運行的服務”視圖)
正如上面提到的,後台服務是一個無界面、長時間運行的應用功能,並且不會輕易被終止,即便你使用“任務管理器”。(其實可以在“服務”界面找到它並且手動停止服務,只不過沒有這個必要性,交給系統自動處理即可。當你長時間不使用某個應用程序時,系統會認為你已經不再需要了並且會自動幫你結束除根活動之外的所有活動。)
至此,我們已經知道為什麼Android應用程序不需要手動退出了。因為聰明的系統已經幫助用戶做了許多事情,包括退出應用程序以及恢復可用內存。
受限於Android官方對設計規范的態度,Android並沒有像iOS那樣明文告訴設計者不需要這個不需要那個。Android應用程序的設計模式也因此而“百花齊放”,很難形成較為統一的體驗。比如本文提到的需不需要手動退出Android應用程序的話題,如果在iOS中看到屏幕上有退出應用程序的按鈕,是一件搞笑的事情。
無論如何,Android也好iOS也罷,用戶本來就不需要關注“進程”或“內存管理”、“任務管理”這些東西。用完,離開界面即可,就這麼簡單!把用戶不需要關注的問題拋給用戶,無異於“不想讓小孩玩火,但是又給他一個打火機。”
而設計師們,該做些什麼了。改變吧!
看到這裡,也許你會問:既然Android應用程序在後台被掛起暫停了,但是為何開多了應用程序手機還是會變慢呢?
一方面:新運行的應用程序如果需要較大的內存,自然會比較慢。另外,如果手機本身的內存過小且CPU不給力,系統自然會因較頻繁地自動結束進程釋放緩存而導致手機在某些時候運行比較慢的感覺。
也正因為這樣,我們知道了為什麼“任務管理器”會如此流行,甚至成了“裝機必備”。人們用它來快速
提前釋放緩存以保證運行新應用程序時有足夠的內存。當然,隨著CPU頻率越來越高,內存越來越大的發展趨勢,手動清除緩存已經慢慢變得不再需要。
另一方面:臨時啟動的後台服務可能會導致手機變慢。有些應用程序在後台監聽到指定的事件會自動啟動,比如操作系統本身的“Google服務”,又比如連接USB並且在PC上啟動“豌豆莢手機精靈”,手機上的“豌豆莢守護精靈”會自動啟動。為了避免這種情況,只能建議你有選擇性的安裝應用程序了。聰明的軟件需要先進的硬件來支持。
也許你又會問:既然在應用程序主界面用返回鍵可以直接退出應用程序,可是為什麼某Android應用程序(尤其是國內的)要彈出退出確認對話框呢?
這其實更多的是產品人出於不希望自己的應用程序太容易被用戶“退出”,或是擔心“誤操作”的原因,為此給用戶增加一道障礙牆。
瞧瞧我們眼前的PC軟件吧!單擊窗口右上角的 X 圖標後,也有不少軟件在干同樣的事情呢。
毫不客氣地說,這是典型的把責任推卸給用戶的做法。似乎在警告用戶:“真的要退出了?確定的話我就不管你了!”
我們應該
盡可能少使用對話框,提供必要的容錯支持。允許用戶犯錯,並給予恢復的機會。比如你可以允許用戶在按下返回鍵離開應用程序後還能再次返回現場。這在很多優秀的第三方應用程序上均有體現,比如Twitter、米聊……
當然,沉浸式的應用程序除外。比如影片正在播放或者游戲正在進行的畫面,應當盡可能地不要讓用戶犯錯被退出。
沉浸式的應用程序應當提供沉浸式的體驗保障,因為游戲或影片進行到一半被退出往往是無法返回現場的。
最後,補充說明:本文所說的“退出”是指退出應用程序,而不是指退出帳戶的登錄狀態。如果你的應用程序是需要用戶使用帳號密碼登錄的,那麼提供“退出登錄”(或叫“注銷”)的功能是必要的。