Android中監(jiān)聽Home鍵的4種方法總結(jié)
昨天需要處理一個(gè)問題,需要監(jiān)聽home鍵。最開始想到使用onKeydonwn這個(gè)方法。但是發(fā)現(xiàn)home不能這樣處理,onKeydonwn可以處理菜單鍵和back鍵,但home不能。因?yàn)閔ome鍵是系統(tǒng)鍵,情況特殊一些。
看了一下網(wǎng)上的資料,說下面的方法可以。(其實(shí)不行)
@Override
public void onAttachedToWindow() {
// TODO Auto-generated method stub
Log.d("aeon","onAttachedToWindow");
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
加了權(quán)限之后也不行。
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" >
</uses-permission>
實(shí)驗(yàn)幾次之后(android4.1 和android4.2)發(fā)現(xiàn)在單個(gè)的activity里面有以下幾個(gè)方法可以使用:
方法1:onSaveInstanceState方法
下面這個(gè)方法可以處理home的監(jiān)聽問題。
protected void onSaveInstanceState(Bundle outState)
但這個(gè)方法不是很好,不推薦
方法2:onUserLeaveHint方法
@Override
protected void onUserLeaveHint() {
Log.d("aeon","onUserLeaveHint");
super.onUserLeaveHint();
}
這個(gè)方法會(huì)在onSaveInstanceState之前執(zhí)行,根據(jù)api的解釋,這個(gè)方法還比較合適的。
方法3:ACTION_CLOSE_SYSTEM_DIALOGS
在使用廣播監(jiān)聽方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS
//注冊(cè)Receiver
HomeKeyEventBroadCastReceiver receiver = new HomeKeyEventBroadCastReceiver();
registerReceiver(receiver, new IntentFilter(
Intent. ACTION_CLOSE_SYSTEM_DIALOGS));
方法4:framework PhoneWindowManager.java 處理
想要完全監(jiān)聽home鍵需要在framework層去處理。
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
里面去修改private void handleLongPressOnHome() 這個(gè)方法。
private void handleLongPressOnHome() {
// We can't initialize this in init() since the configuration hasn't been loaded yet.
if (mLongPressOnHomeBehavior < 0) {
mLongPressOnHomeBehavior
= mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);
if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||
mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
}
}
if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);
// Eat the longpress so it won't dismiss the recent apps dialog when
// the user lets go of the home key
mHomeLongPressed = true;
}
if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {
showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
} else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
try {
IStatusBarService statusbar = getStatusBarService();
if (statusbar != null) {
statusbar.toggleRecentApps();
}
} catch (RemoteException e) {
Slog.e(TAG, "RemoteException when showing recent apps", e);
// re-acquire status bar service next time it is needed.
mStatusBarService = null;
}
}
}
只要把handleLongPressOnHome里面做出相對(duì)應(yīng)的處理就ok
- android 電話狀態(tài)監(jiān)聽(來電和去電)實(shí)現(xiàn)代碼
- Android應(yīng)用中Back鍵的監(jiān)聽及處理實(shí)例
- Android中檢查、監(jiān)聽電量和充電狀態(tài)的方法
- Android中實(shí)現(xiàn)監(jiān)聽ScrollView滑動(dòng)事件
- android中使用Activity實(shí)現(xiàn)監(jiān)聽手指上下左右滑動(dòng)
- Android中監(jiān)聽判斷網(wǎng)絡(luò)連接狀態(tài)的方法
- android Animation監(jiān)聽器AnimationListener的使用方法)
- 全面解析Android中對(duì)EditText輸入實(shí)現(xiàn)監(jiān)聽的方法
- Android控件系列之Button以及Android監(jiān)聽器使用介紹
- Android自定義ScrollView使用自定義監(jiān)聽
相關(guān)文章
Android實(shí)現(xiàn)中國(guó)象棋附源碼下載
這篇文章主要詳細(xì)介紹了Android實(shí)現(xiàn)中國(guó)象棋的具體代碼,供大家參考,感興趣的小伙伴們可以參考一下2016-05-05Kotlin 高階函數(shù)與Lambda表達(dá)式示例詳解
這篇文章主要為大家介紹了Kotlin 高階函數(shù)與Lambda表達(dá)式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android開發(fā)中關(guān)于獲取當(dāng)前Activity的一些思考
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)過程中,關(guān)于獲取當(dāng)前Activity的一些思考,感興趣的小伙伴們可以參考一下2016-02-02Flutter實(shí)現(xiàn)用視頻背景的登錄頁(yè)的示例代碼
這篇文章主要介紹了Flutter實(shí)現(xiàn)用視頻背景的登錄頁(yè)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Android布局中g(shù)ravity與layout_gravity屬性說明
這篇文章主要介紹了Android布局中g(shù)ravity與layout_gravity屬性說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01分析Android 11.0Settings源碼之主界面加載
這篇文章主要介紹了分析Android 11.0Settings源碼之主界面加載,對(duì)Android源碼感興趣的同學(xué),可以著重看一下2021-04-04Android實(shí)現(xiàn)TextView中文字鏈接的4種方式介紹及代碼
Android實(shí)現(xiàn)TextView中文字鏈接的方式有很多種;總結(jié)起來大概有4種:用Spannable或?qū)崿F(xiàn)它的類,如SpannableString來格式,部分字符串等等,感興趣的你可以參考下2013-02-02Android開發(fā)之InetAddress基礎(chǔ)入門簡(jiǎn)介與源碼實(shí)例
這篇文章主要介紹了Android開發(fā)之InetAddress基礎(chǔ)入門簡(jiǎn)介,需要的朋友可以參考下2020-03-03Android?Flutter實(shí)現(xiàn)創(chuàng)意時(shí)鐘的示例代碼
時(shí)鐘這個(gè)東西很奇妙,總能當(dāng)做創(chuàng)意實(shí)現(xiàn)的入口。這篇文章主要介紹了如何通過Android?Flutter實(shí)現(xiàn)一個(gè)創(chuàng)意時(shí)鐘,感興趣的小伙伴可以了解一下2023-03-03