在2.3.x 的主要做法如下,具体实现网上有很多文章
@Override
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
代码移植到4.0.1后 this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 这行报错,
错误提示:java.lang.IllegalArgumentException: Window type can not be changed after the window is added。
可以有两种处理方式
方法一、修改PhoneWindowManager.java
if (keyCode == KeyEvent.KEYCODE_HOME) {
//在这里发送一个广播出去
}在应用里接收到广播后做相应处理,一般是做手机项目才会去改源码。
方法二、检测log,根据log判断是否有点击Home键
private boolean isTesting = true;
class CatchLogThread extends Thread {
@Override
public void run() {
Process mLogcatProc = null;
BufferedReader reader = null;
String line;
while (isTesting) {
try {
// 获取logcat日志信息
mLogcatProc = Runtime.getRuntime().exec(new String[] { "logcat", "ActivityManager:I *:S" });
reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));
while ((line = reader.readLine()) != null) {
if (line.indexOf("android.intent.category.HOME") > 0) {
isTesting = false;
handler.sendMessage(handler.obtainMessage());
Runtime.getRuntime().exec("logcat -c");//删除日志
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
Log.i(TAG,"Home key press");
//do something here
};
};
参考文章: Android软件开发之在程序中时时获取logcat日志信息

本文探讨了当在Android应用中尝试修改窗口类型以响应Home键事件失败时,采用两种策略来实现这一目标。第一种方法涉及直接修改源代码,第二种则依赖于实时监控日志以检测Home键被按下。通过发送特定广播并在应用内接收,开发者可以在Home键事件触发后执行相应的逻辑。同时,文章提供了一个示例代码片段和相关链接,帮助开发者深入理解实现细节。
2250





