今天在做一個應用的時候要用到類似於QQ按返回鍵並不銷毀Activity的方法(即不調用Activity.finish(),系統不調用onDestroy),而是類似於按Home鍵,讓Activity類似於“暫停”(即只調用onPause,onDestroy)。
最開始想到的便是Override onKeyDown 這個方法,但經過調試,發現這個在按下Home鍵時,系統是不會發送訊息到這裡處理的,也就是說類比KEYCODE_HOME 是沒有效果的,之後又在網上查到 dispatchKeyEvent 這個函數,以下是函數說明:
Called to process key events. You can override this to intercept all key events before they are dispatched to the window. Be sure to call this implementation for key events that should be handled normally.
但令人沮喪的是,Home 按鈕所產生的訊息依然不經過這裡,似乎Home按鈕所產生的訊息是由系統處理的。於是想到從其他方面入手,最後找到了以下的方法:
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubif(keyCode == KeyEvent.KEYCODE_BACK){Intent intent = new Intent(Intent.ACTION_MAIN);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 注意intent.addCategory(Intent.CATEGORY_HOME);this.startActivity(intent);return true;}return super.onKeyDown(keyCode, event);}
特別注意 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 這句,一定要加上,因為Activity 的 launchMode 預設是以 standard 執行的,如果不添加這個標記則 會建立新的Activity 並放在與當前Activity相同的Task中。以下是 FLAG_ACTIVITY_NEW_TASK 的說明
FLAG_ACTIVITY_NEW_TASK標記
當傳遞給startActivity()的Intent對象包含FLAG_ACTIVITY_NEW_TASK標記時,系統會為需要啟動的activity尋找與當前activity不同的task。如果要啟動的activity的affinity屬性與當前所有的task的affinity屬性都不相同,系統會建立一個帶那個affinity屬性的task,並將要啟動的activity壓到建立的task棧中;否則將activity壓入那個affinity屬性相同的棧中。
更多Affinities和Task知識,參見 (轉載)Android下Affinities和Task