Android 完全退出應用程式

來源:互聯網
上載者:User

標籤:

隨著商務邏輯越來越複雜,退出應用程式也不像之前那個直接將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 完全退出應用程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.