首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下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);
}
好啦,这里就对Home键进行简单的监听和拦截。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# home键监听
# android拦截home键
# 安卓监听home键
# Android来电拦截的实现方法
# Android自动拦截与接听功能APK黑白名单
# 按下
# 看一下
# 也有
# 可以看到
# 三种
# 可以使用
# 当我们
# 就对
# 好啦
# 创建一个
# 大家多多
# 就可以
# 类中
# assist
# SYSTEM_DIALOG_REASON_ASSIST
# homekey
# Override
# Context
# onReceive
# void
相关文章:
实例解析angularjs的filter过滤器
如何用美橙互联一键搭建多站合一网站?
利用JavaScript实现拖拽改变元素大小
宝塔面板如何快速创建新站点?
详解jQuery停止动画——stop()方法的使用
如何在Windows服务器上快速搭建网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
简单实现Android验证码
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
中山网站推广排名,中山信息港登录入口?
网站制作需要会哪些技术,建立一个网站要花费多少?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
网站按钮制作软件,如何实现网页中按钮的自动点击?
已有域名和空间如何搭建网站?
如何在云主机上快速搭建多站点网站?
建站之星安装后界面空白如何解决?
淘宝制作网站有哪些,淘宝网官网主页?
,石家庄四十八中学官网?
广州建站公司哪家好?十大优质服务商推荐
制作企业网站建设方案,怎样建设一个公司网站?
网站制作话术技巧,网站推广做的好怎么话术?
建站之星如何实现PC+手机+微信网站五合一建站?
如何通过主机屋免费建站教程十分钟搭建网站?
如何用花生壳三步快速搭建专属网站?
如何通过wdcp面板快速创建网站?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
建站之星代理商如何保障技术支持与售后服务?
c# 在ASP.NET Core中管理和取消后台任务
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
长沙企业网站制作哪家好,长沙水业集团官方网站?
建站之星如何配置系统实现高效建站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
如何基于PHP生成高效IDC网络公司建站源码?
如何在IIS中新建站点并配置端口与IP地址?
如何确保西部建站助手FTP传输的安全性?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
名字制作网站免费,所有小说网站的名字?
济南企业网站制作公司,济南社保单位网上缴费步骤?
建站主机与服务器功能差异如何区分?
网站制作员失业,怎样查看自己网站的注册者?
*服务器网站为何频现安全漏洞?
如何自定义建站之星模板颜色并下载新样式?
如何用AWS免费套餐快速搭建高效网站?
如何构建满足综合性能需求的优质建站方案?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站主机如何选?高性价比方案全解析
*请认真填写需求信息,我们会在24小时内与您取得联系。