1.onUserLeaveHint

相比Home键(HOME)而近期应用的关键(APP_SWITCH)治,回车键很简单。复onKeyDown可以实现,如以下:

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// KeyEvent.KEYCODE_HOME KeyEvent.KEYCODE_APP_SWITCH
if (keyCode == KeyEvent.KEYCODE_BACK) {
exitAction();
return true;
} else
return super.onKeyDown(keyCode, event);
}

HOME和APP_SWITCH比較复杂,尤其是HOME键,假设不特殊设置。有可能会被恶意应用利用。

所以即使是处理了HOME键,实測会首先进入Launcher,一段时间后才会运行我们的操作,想必这也是系统层从安全角度的考量。有时间看一下系统源代码。

尝试过多种方式之后。复写onUserLeaveHint函数比較便捷。例如以下就可以:

 @Override
protected void onUserLeaveHint() {
//super.onUserLeaveHint();
exitAction();
}

把操作写在了exitAction函数中,这里以启动设置为例:

 private void exitAction() {
try {
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.android.settings",
"com.android.settings.Settings");
intent.setComponent(componentName);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}

2.DISABLE_KEYGUARD

AndroidManifest.xml加权限:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

Activity处理:

public class Main extends Activity {
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);
setContentView(R.layout.main);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// KeyEvent.KEYCODE_HOME KeyEvent.KEYCODE_APP_SWITCH
if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME)
return true;
else
return super.onKeyDown(keyCode, event);
}
}

3.Frameworks源代码改动

Android中的Home Key,Power Key默认都是由系统的Framework来响应。假设想让自己的应用捕获响应,该怎么做呢?

Home Key比較简单,不涉及系统源代码改动:

getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);
  1. 重写此 main Activity 的 onKeyDown() 方法, 实现 home key 的处理部分, 并
return true;

Power Key略微麻烦一些。要改动源代码:

1: 改动 phoneWindowManager.java 的 interceptKeyBeforeQueueing 方法,在參考行后增加:

case KeyEvent.KEYCODE_POWER: { // 參考行
result &= ~ACTION_PASS_TO_USER; // 參考行
// add begin
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
try{
if (activityManager.getRunningTasks(1).get(0).topActivity.getPackageName().equals("
your_special_package_name")){
//Please reset the special package name.
result |= ACTION_PASS_TO_USER;
Xlog.d(TAG,"detect power key in special package, pass to user!")
}
}catch(NullPointerException e){
Xlog.d(TAG,"ingore a NullPointerException ..");
}
//add end

2: 相同在此分支内, 找到 else 语句段, 并找到例如以下位置增加

if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) { // 參考行
if(!((result
& ACTION_PASS_TO_USER) == ACTION_PASS_TO_USER)){ //增加行
result = (result & ~ACTION_WAKE_UP) | ACTION_GO_TO_SLEEP; //原有代码
}
}
//增加行

周木水的CSDN博客

版权声明:原创文章,转载请注明出处:http://blog.csdn.net/zhoumushui

Android HOME纽带,BACK主要采集和响应的更多相关文章

  1. Android HTTP实例 发送请求和接收响应

    Android HTTP实例 发送请求和接收响应 Android Http连接 实例:发送请求和接收响应 添加权限 首先要在manifest中加上访问网络的权限: <manifest ... & ...

  2. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  3. Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决

    最近在学习Android开发,在编写程序的过程中,发现EditText setOnClickListener事件响应中,只有获取焦点的时候才会响应, 如当焦点在别的控件上时,只能先点击获取焦点,第二次 ...

  4. android小程序-电子钢琴-滑动连续响应

    原创文字,转载请标明出处: 利用Button实现简单地电子钢琴,可以简单地响应按钮的click事件来发出相应的声音.但是这样不能达到手指在屏幕滑动,而连续发声的效果,就像手指在真实钢琴按键上滑过一样. ...

  5. Android ListView的item点击无响应的解决方法

    假设listitem里面包含button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最经常使用的解决的方法 是在listitem的布局文件里设置des ...

  6. EasyRTMP安卓Android手机直播之AAC采集、编码与RTMP推送

    本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52963378 EasyRTMP Android版de ...

  7. Android实例1:button点击响应

    个人网站http://www.ravedonut.com/ Layout xml文件 <RelativeLayout android:layout_width="wrap_conten ...

  8. android 使用动画 Button移动后不响应点击事件的解决办法

    animation3.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimatio ...

  9. Android 音频 OpenSL ES 录音 采集

    1,; int channelConfig = AudioFormat.CHANNEL_OUT_STEREO; int audioFormat = AudioFormat.ENCODING_PCM_1 ...

随机推荐

  1. 用GDB调试多进程程序

    在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...

  2. POJ 1386 有向图欧拉通路

    题意:给你一些字符串,这些字符串可以首位相接(末位置如果和另一个字符串的首位置相同的话就可以相连) .然后问你是否可以全部连起来. 思路:就是取出每个字符串的首尾位置,然后求出出度和入度,根据有向欧拉 ...

  3. snappydb 依赖的jar包

    最近看学习了一下snappydb,因为我用的还是Eclipse但是github上的是as项目所以就考虑用jar包来使用. github地址:https://github.com/nhachicha/S ...

  4. 用IO流发送Http请求

    package com.j1.mai.action; import java.io.BufferedReader; import java.io.DataOutputStream; import ja ...

  5. Ajax七层模型用途

    Ajax七层模型 OSI七层模型满足所有网格模型 1.物理层:符合标准: 2.数据链路层:如网卡.水晶头.连接网络层等: 3.网络层:路由器(数据外围打IP地址): 4.传输层:两台计算器端口的连接: ...

  6. 关于css样式line-height的应用

    今天做项目,改一个东西,要求<li>背景</li>,背景下加个下划线,用了背景: #left_menu_tiandi ul li{ width:110px; backgroun ...

  7. Android-操作栏之副标题

    我们的目标是在操作栏右侧加上一个选项菜单,点击它就可显示或者隐藏操作栏的副标题. 由于操作栏是在API11级以后出现的,因此必须考虑兼容性问题.我们直接让低于API11的设备根本看不到选项菜单即可.建 ...

  8. java下properties属性文件操作

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  9. Struts2 的国际化实现

    以前一直看见 i18N ,现在才知道原来 i18N 就是 Internationalization,因为以 i 开头,以 N 结尾,共18个字母,也就是国际化的意思.在百度搜索主页上没有看见中英文的切 ...

  10. web标准(复习)--7 横向导航菜单

    今天我们开始学习html列表,包含以下内容和知识点: 横向列表菜单 用图片美化的横向导航 css Sprites 一.横向列表菜单前边学习过纵向导航菜单,又学习了float属性,那么要实现横向导航菜单 ...