android 点击home键事件,Android应用中如何监听与拦截Home键

Android应用中如何监听与拦截Home键

发布时间:2020-11-23 16:40:35

来源:亿速云

阅读:175

作者:Leah

这篇文章将为大家详细讲解有关Android应用中如何监听与拦截Home键,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1、在应用中按下Home键的逻辑处理

当我们在应用中按下Home键时界面会启动到桌面,我们在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.Java类中可以看到其实现原理,其不外乎就是调用了以下代码。

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);

创建一个启动到桌面的Intent。

2、在应用中监听Home键

在Android应用中如果想监听Home键可以使用广播机制,这个在源码中也有体现。

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键会发送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();

}

}

}

}

这样就可以监听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();

}

}

//进入handleShortPressOnHome

private 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的相关设置

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);

}

关于Android应用中如何监听与拦截Home键就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值