1. 程式人生 > >Android 程式退出 Toast還一直顯示 解決方案

Android 程式退出 Toast還一直顯示 解決方案

今天,改了個bug:點選兩次返回程式退出。
如大家所想,第一次點選用Toast提示,如果在兩秒內再次點選那麼程式退出。
在我們平時寫App的時候,習慣用Application的上下文物件,但是可能大家不是很清楚這個上下文物件到底有什麼用,當然大家可以目前認為是一個依附的物件。
接下來說說問題吧:
App退出之後,我的Toast還在顯示,一直消失不了。

先說說我的操作吧:


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if
((System.currentTimeMillis() - mExitTime) > 2000) { toast("再按一次退出程式"); mExitTime = System.currentTimeMillis(); } else { exitMainApp(); } return true; } return super.onKeyDown(keyCode, event); }

    public void exitMainApp() {

        MyApplication.getmApplication().exitApp();

    }

–再來看一下exitapp方法

  public void exitApp() {
        try {
            for (Activity activity : activityList) {
                if (!activity.isFinishing()) {
                    activity.finish();
                    System.exit(0
); } } } catch (Exception e) { e.printStackTrace(); } }

在我的BaseActivity裡已經做了將Toast銷燬的操作

    @Override
    protected void onStop() {
        super.onStop();
        ToastUtil.cancleToast();
    }

在我鎖屏之後再開鎖雙擊返回出現了Toast不能消失的情況,並且通過我列印log日誌,Activity的onDestroy並沒有走。抓破腦袋想了一系列的問題可能,也許是因為Toast繫結的context的問題;後來證實並不是。

後來看了一些關於System.exit(0) 的文章,可以參考一下:
http://blog.sina.com.cn/s/blog_48e2ea3401017m3f.html
本來我也想,明明程序都結束了,為什麼Toast不結束呢。
我們要做的是將殺死程序的 System.exit(0) 的操作放到Activity的onDestory方法裡,這樣程式就能正常退出。至於為什麼我還沒找到原因,希望明白的大神或者大佬可以在評論裡來寫出。

最後將所有地方的 System.exit(0)全部註釋掉,放到首頁的onDestory裡面:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("MainActivity", "onDestroy");
        System.exit(0);

    }

一切正常。。。。

問題已經解決,但是原因並不是特別的清晰,還是希望真正的可以找到原因所在。
事到如今,個人還是不建議用 System.exit(0); 雖然強制結束了虛擬機器,但是有時會導致application的oncreate方法重新執行,但是app的視覺化介面並沒有顯示。 6.0的ART機制已經很好了,所以後續沒有再使用System.exit(0);
取其精華去其糟粕吧。