標籤:
隨著商務邏輯越來越複雜,退出應用程式也不像之前那個直接將Activity finish()掉就可以了,在網上看到很多完全退出App的文章,但是實踐之後發現,並不像文章中描述的那樣,不是方法過時了,就是在某些SDk版本下不好用,
最後經過多次實踐,找到兩種方法可以完美解決現在業務需要的完全退出App的方法:
方法一:
1.將LoginActivity的launcMode設定成singleTask,然後讓它始終佔據棧底的位置,其他動作需要退回到LoginActivity時,只需要調用Actvity的startActivity()方法啟動LoginActivity即可,因為SingleTask模式會保持棧中只有一個執行個體,當要啟動的Activity在棧中已經存在時,系統會自動將LoginActivity上的Activity出棧,讓LoginActivity顯示在棧頂,這種情況僅適用於LoginActivity不需要更新的情況。
2.當LoginActivity中的資料需要更新,我們又該怎麼做呢?研究Activity的生命週期不難發現,當Activity真正顯示的時候,總會調用Activity的resume()方法,那麼我們就可以在這裡執行一些更新介面的操作,
想瞭解Activity生命週期的話,可以看這篇文章:http://www.cnblogs.com/butterfly-clover/p/4428313.html
3.上面講述的是退回到登入頁,那麼如果我想再首頁直接退出app又該執行什麼操作呢?很簡單,在退出方法中,啟動LoginActivity,這樣現在棧中就只剩LoginActivity了,然後通過一個參數控制,告訴LoginActivity我是要退出,然後LoginActivity自己把自己結束掉就可以了
方法二:方法一所提供的解決方案,對於某些人來講可能有點複雜,現在再提供一種更直接的,即通過單例模式建立一個ActivitManager。使用單例模式,有兩種實現方法,一是採用鏈表,另一個是採用棧,表面看,棧更符合Activity的管理,但如果僅僅是為瞭解決完全退出App的問題,個人覺得鏈表的方案更簡單,具體根據個人需求選擇
鏈表方式:啟動Activity時把它加入鏈表,退出App時,清空鏈表下面上實現代碼:
(1)MyApplication類(儲存每一個Activity,並實現關閉所有Activity的操作)
public class MyApplication extends Application { private List<Activity> activityList = new LinkedList<Activity>(); private static MyApplication instance; public MyApplication() { } public static MyApplication getInstance() { synchronized (MyApplication.class) { if (null == instance) { instance = new MyApplication(); } } return instance; } //add Activity public void addActivity(Activity activity) { activityList.add(activity); } public void exit() { try { for (Activity activity : activityList) { if (activity != null) activity.finish(); } } catch (Exception e) { e.printStackTrace(); } finally { System.exit(0); } } public void onLowMemory() { super.onLowMemory(); System.gc(); }}
(2)在每一個Activity中的onCreate方法裡添加該Activity到MyApplication對象執行個體容器中
MyApplication.getInstance().addActivity(this);
註:如果覺得在每個Activity中調用這句代碼比較麻煩,可以定義一個BaseActivity類繼承自Activity,在BaseActivity的onCreate方法中加入這句代碼,然後讓其他的Activity繼承BaseActivity即可。
(3)在需要結束所有Activity的時候調用exit方法
MyApplication.getInstance().exit();
棧方式:啟動Activity時使它入棧,結束Activity的時候,使它出棧,退出App時,清空棧,下面上實現代碼:
(1)MyApplication類(儲存每一個Activity,並實現關閉所有Activity的操作)
代碼1:用stack的push()和pop()方法
public class MyApplication extends Application { private static Stack<Activity> activityStack =new Stack<Activity>(); private static MyApplication instance; public MyApplication() { } public static MyApplication getInstance() { synchronized(MyApplication.class) { if (null == instance) { instance = new MyApplication(); } } return instance; } //add Activity public void addActivity(Activity activity) { activityStack.push(activity); } public void exit() { try{ while (!activityStack.isEmpty()){ Activity activity = activityStack.lastElement(); activity.finish(); activityStack.pop(); activity = null; } }catch (Exception e){ e.printStackTrace(); }finally{ System.exit(0); } } public void onLowMemory(){ super.onLowMemory(); System.gc(); }}
代碼2:用stack繼承自Vector,調用Vector的add()和remove()方法
public class MyApplication extends Application { private static Stack<Activity> activityStack = new Stack<Activity>(); private static MyApplication instance; public MyApplication() { } public static MyApplication getInstance() { synchronized (MyApplication.class) { if (null == instance) { instance = new MyApplication(); } } return instance; } //add Activity public void addActivity(Activity activity) { activityStack.add(activity); } public void exit() { try { while (!activityStack.isEmpty()) { Activity activity = activityStack.lastElement(); activity.finish(); activityStack.remove(activity); activity = null; } } catch (Exception e) { e.printStackTrace(); } finally { System.exit(0); } } public void onLowMemory() { super.onLowMemory(); System.gc(); }}
註:代碼1和代碼2選擇一個使用即可
(2)在每一個Activity中的onCreate方法裡添加該Activity到MyApplication對象執行個體容器中
MyApplication.getInstance().addActivity(this);
註:如果覺得在每個Activity中調用這句代碼比較麻煩,可以定義一個BaseActivity類繼承自Activity,在BaseActivity的onCreate方法中加入這句代碼,然後讓其他的Activity繼承BaseActivity即可。
(3)在需要結束所有Activity的時候調用exit方法
MyApplication.getInstance().exit();
Android 完全退出應用程式