2018年2月21日 星期三

[Android] 離開App寫法 (Quit App)

問題:我想在Android App裡寫個離開(exit/ quit)功能,該怎麼寫呢?

參考:掘金1掘金2CSDNStackOver1龍崗山上的倉鼠StackOverflow2StackOverflow3DevAndroid1DevAndroid2DevAndroid3DevAndroid4

說明:
首先,Google不建議開發者自己殺掉整個App Process,而是交由系統處理,只要畫面全部finish()即可,而且有在各畫面的onDestroy()處理掉該處裡的東西(Thread、Handler、interface...),這樣gc在整理時應該會順利清除。
甚至建議開發者不要在App裡加離開按鈕。

看來真有人照做,我看LINE、FB、FB Messenger都是在Root Activity(最下層的)時再按返回,就回到桌面,但其實process沒死,點icon再開,不會從啟動畫面(splash screen)進去。但如果從多工鍵(Overview Button)進去滑掉他的Task(這才真的殺掉process),下次就會重啟。

另外,Play商店、GMail、YouTube不管有沒有滑掉,離開再點icon都是從同樣畫面進去,只是這三隻也都沒離開鈕,都是在Root Activity時再按返回,就回到桌面了。


但是,Dev是每個都那麼強嗎?不會少處理造成MemoryLeak而無法回收嗎?
或是說工程師的潔癖就是不要留太多垃圾等打掃阿姨(GC)來收呀 XD

如果,你不聽Google言,一定要做Quit App,就看掘金1掘金2這兩篇選個方法做吧
裡面方法實在太多種了:

簡單說,殺掉process的方式有以下兩種,效果看來一樣..
System.exit(0); 跟 android.os.Process.killProcess(android.os.Process.myPid());
只是在做這件事之前,你要先把Activities關閉,才不會造成重啟。

所以啦,

  • 如果你的Quit()寫在RootActivity,或只有一個Activity,只要把自己finish()然後再exit(0),就好了。
  • 如果你的Quit()寫在非RootActivity也可調用,那你就finish()所有Activities,然後再exit(0)吧。這方法很多,以下推幾種:
    如果你min=API 21+,可以用finishAndRemoveTask();
    如果你min=16+且只有一個Task,可以用finishAffinity();
    如果你min<16或有多個Tasks,那可用List保存Activities法。




沒有留言:

張貼留言