Android 如何在自己的應用中模擬Home鍵

Android 如何在自己的應用中模擬Home鍵

  今天在做一個應用的時候要用到類似於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按鈕所產生的消息是由系統處理的。於是想到從其他方面入手,最後找到了以下的方法:

01 @Override
02 public boolean onKeyDown( int keyCode, KeyEvent event) {
03      // TODO Auto-generated method stub
04      if (keyCode == KeyEvent.KEYCODE_BACK){
05          Intent intent = new Intent(Intent.ACTION_MAIN);
06          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 注意
07          intent.addCategory(Intent.CATEGORY_HOME);
08          this .startActivity(intent);
09          return true ;
10      }
11      return super .onKeyDown(keyCode, event);
12 }

  特別注意 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章