Android 中幾種優雅的退出APP方式介紹
我們的態度是:每天進步一點點,理想終會被實現。
前言
最近由於項目的修改,項目由MainActivity按返回鍵一次退出修改為MainActivity中連續按兩次返回鍵退出,順便優化一下推出這裡的代碼。因此還是在網上搜索了一番,總結比較之後得出了有以下集中方式,優缺點都會提出來,有需要的老鐵按需選擇。
目錄
常見的有6中方式:
容器式
便捷式
廣播式
進程式
SingleTask式
實現方法
1.容器式
容器式可能是我們最常見的方式之一了,主要通過創建一個全局的容器,把所有的Activity都保存下來,退出的時候循環遍歷所有activity,然後finish()掉。
BaseActivity添加代碼:
創建一個全局工具類:
這種方式是有一定的缺點的,我們的工具類ActivityUtils持有Activity的引用,當我們的應用發生異常,ActivityUtils持有的引用沒有被銷毀會導致部分內存問題,而且代碼量多,不夠優雅,諸多不便。
但是容器式這種方式還是有解決辦法的,我們可以採用弱引用的方式,就不存在前面所說的問題了,習慣於容器式的可以採用弱引用這種方式的。
2.便捷式
在之前,先講一下Activity的啟動模式:SingleTask
我們知道Activity有四種載入模式,而singleTask就是其中的一種,使用這個模式之後,當startActivity時,它先會在當前棧中查詢是否存在Activity的實例,如果存在,則將其至於棧頂,並將其之上的所有Activity移除棧。我們打開一個app,首先是一個splash頁面,然後會finish掉splash頁面。跳轉到主頁。然後會在主頁進行N次的跳轉,期間會產生數量不定的Activity,有的被銷毀,有的駐留在棧中,但是棧底永遠是我們的HomeActivity。這樣就讓問題變得簡單很多了。我們只需兩步操作即可優雅的實現app的退出。
有了這麼一個啟動模式,就好辦了,我們將退出的出口放在MainActivity中所有事都解決了。
那麼這種方法為什麼叫便捷式呢?這種方式代碼量很少而且很好理解、優雅,而且市面上很多APP都是基於此實現的。我們在MainActivity中實現如下代碼:
不要著急,不要以為就完了,還有很重要的一步:將MainActivity設置為singleTask。
上面這種方法就是我個人認為最簡便的方式了,這也符合有些要求按2次退出。
3.廣播式
我相信很多的老鐵是使用的廣播式,畢竟很方便,先上代碼,再說利弊。
最後再需要退出的地方,發送一個廣播就可以了,注意Action和註冊的相同就可以了。
但是個人覺得這種方式還是太耗性能,畢竟廣播是進程間通信,我們一個退出APP功能不是特別的有必要。
4.SingleTask式
簡單解釋一下SingleTask這種啟動模式的兩個特點:
清除堆棧中處於當前Activity上方的Activity
堆棧中含有你要啟動的Activity時,不會重新創建。
假設我們的MainActivity是使用的SingleTask的啟動模式,假設我跳轉到了其他的頁面,然後使用startActivity(this,MainActivity.class)的方式再次啟動MainActivity,這時MainActivity走到onNewIntent()方法,然後按照生命周期onRestart()——>onStart()——>onResume(),MainActivity不會重新創建。
既然有這麼一個特點我們就可以分三步來退出APP:
第一步:MainActivity設置為SingleTask。
第二步:重寫MainActivity中的onNewIntent方法
第三步:需要退出時在Intent中添加退出的tag
雖然這種方式簡單、便捷,但還有弊端:當我們需要退出的時候,假如是在其他的Activity中退出,這時MainActivity要走一段生命周期的方法,有點浪費。
5.進程式
這三種方式都能夠達到殺死進程的效果,直接退出APP,但是這種太暴力了不推薦使用,而且使用體驗不好。不知道是不是華為手機問題,我用華為P10 Plus使用這種方式退出的時候要白屏、閃屏一下,反正就是不建議使用這種方式。
總結
其實嚴格來說,還有一種方式就是拋異常讓APP強制退出,因為感覺用的人不多就沒有細說。
上面的幾種方式中,最不推薦的就是最後第五種方式,暴力而且用戶體驗不好。大家在項目中看著需求、以及自己習慣的方式來選擇就好,今天就到這裡了。
溫馨提示:
另外關注公眾號,還有一些個人收藏的視頻:
關注我,一定會有意想不到的東西等你:
每天專註分享Android、JAVA乾貨
備註:程序圈LT
TAG:程序圈LT |