国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android中Home鍵的監(jiān)聽和攔截示例

2019-12-12 03:44:29
字體:
供稿:網(wǎng)友

首先大家應(yīng)該先了解一種情況,就是Android在應(yīng)用中是無法攔截Home鍵的,今天我們帶大家看一下Home鍵的三種情況。

1、在應(yīng)用中按下Home鍵的邏輯處理

當我們在應(yīng)用中按下Home鍵時界面會啟動到桌面,我們在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.Java類中可以看到其實現(xiàn)原理,其不外乎就是調(diào)用了以下代碼。

  Intent mHomeIntent;  mHomeIntent = new Intent(Intent.ACTION_MAIN, null);  mHomeIntent.addCategory(Intent.CATEGORY_HOME);  mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  startActivity(mHomeIntent);

創(chuàng)建一個啟動到桌面的Intent。

2、在應(yīng)用中監(jiān)聽Home鍵

在Android應(yīng)用中如果想監(jiān)聽Home鍵可以使用廣播機制,這個在源碼中也有體現(xiàn)。

static public final String SYSTEM_DIALOG_REASON_KEY = "reason";  static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";  static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";  static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";  static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";  @Override  public void onReceive(Context arg0, Intent arg1) {    String action = arg1.getAction();    //按下Home鍵會發(fā)送ACTION_CLOSE_SYSTEM_DIALOGS的廣播    if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {      String reason = arg1.getStringExtra(SYSTEM_DIALOG_REASON_KEY);      if (reason != null) {        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {          // 短按home鍵          Toast.makeText(arg0, "短按Home鍵", Toast.LENGTH_SHORT).show();        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {          // RECENT_APPS鍵          Toast.makeText(arg0, "RECENT_APPS", Toast.LENGTH_SHORT).show();        }      }    }  }

這樣就可以監(jiān)聽Home的是否被按下。

3、在Frameworks層攔截Home鍵

在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件中我們首先看一下interceptKeyBeforeDispatching()方法。

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {  //......  if (keyCode == KeyEvent.KEYCODE_HOME) {    //......    handleShortPressOnHome();  }}//進入handleShortPressOnHomeprivate void handleShortPressOnHome() {    // If there's a dream running then use home to escape the dream    // but don't actually go home.    if (mDreamManagerInternal != null && mDreamManagerInternal.isDreaming()) {      mDreamManagerInternal.stopDream(false /*immediate*/);      return;    }    // Go home!    launchHomeFromHotKey();  }

進入launchHomeFromHotKey方法。

static public final String SYSTEM_DIALOG_REASON_KEY = "reason";  static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";  static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";  static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";  static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";void launchHomeFromHotKey() {    if (isKeyguardShowingAndNotOccluded()) {      // don't launch home if keyguard showing    } else if (!mHideLockScreen && mKeyguardDelegate.isInputRestricted()) {      // when in keyguard restricted mode, must first verify unlock      // before launching home      mKeyguardDelegate.verifyUnlock(new OnKeyguardExitResult() {        @Override        public void onKeyguardExitResult(boolean success) {          if (success) {            try {              ActivityManagerNative.getDefault().stopAppSwitches();            } catch (RemoteException e) {            }            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);            startDockOrHome();          }        }      });    } else {      // no keyguard stuff to worry about, just launch home!      try {        ActivityManagerNative.getDefault().stopAppSwitches();      } catch (RemoteException e) {      }      if (mRecentsVisible) {        // Hide Recents and notify it to launch Home        awakenDreams();        sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);        hideRecentApps(false, true);      } else {        // Otherwise, just launch Home        sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);        //啟動Launcher界面        startDockOrHome();      }    }  }

以上方法可處理Home鍵的攔截操作,接下來我們進入startDockOrHome方法。

void startDockOrHome() {    if (OptConfig.LC_RAM_SUPPORT) {      try {        ActivityManagerNative.getDefault().startHomePre();      } catch (RemoteException re) {      }    }    awakenDreams();    Intent dock = createHomeDockIntent();    if (dock != null) {      try {        startActivityAsUser(dock, UserHandle.CURRENT);        return;      } catch (ActivityNotFoundException e) {      }    }    //intent的相關(guān)設(shè)置    mHomeIntent = new Intent(Intent.ACTION_MAIN, null);    mHomeIntent.addCategory(Intent.CATEGORY_HOME);    mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);    startActivityAsUser(mHomeIntent, UserHandle.CURRENT);  }

好啦,這里就對Home鍵進行簡單的監(jiān)聽和攔截。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂托克前旗| 库伦旗| 霞浦县| 鄂托克前旗| 平乐县| 威远县| 绥化市| 舞阳县| 台安县| 大洼县| 绵竹市| 阳江市| 十堰市| 山东省| 登封市| 邳州市| 天镇县| 毕节市| 托克托县| 屯留县| 崇礼县| 华坪县| 项城市| 平凉市| 宿松县| 商丘市| 类乌齐县| 永胜县| 林芝县| 陈巴尔虎旗| 临武县| 蓝田县| 兴业县| 宁南县| 荥阳市| 思茅市| 夏邑县| 克拉玛依市| 阳高县| 绥芬河市| 印江|