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);
取其精華去其糟粕吧。