onkeydown
和
onkeyup
方法无法来捕获
Home
的动作,那么如何来捕获
Home
键呢?
大家都知道,按
Home
键程序并没有退出(窗口的生命周期只执行到
onStop
方法),只是切换到后台运行了。而按
Back
键或调用
finish
方法则关闭当前程序,当前窗口的生命周期也就结束了。系统会在调用
onDestroy
方法后释放窗口对象(但一些资源并未释放,如静态变量),按
Home
和
Back
键都执行的最后一个方法是
onstop,
所以很容易想到在
onstop
方法中处理按
Home
键的动作。
由于窗口不管以何种方式关闭(按
Back
键、执行
finish
方法等),都会调用
Activity.finish
方法,而且该方法是在调用窗口生命周期之前就调用了,也就是说调用
onpause
方法之前会首先调用
finish
方法。而按
Home
键系统并不会调用
finish
方法,所以覆盖
finish
方法,并在
finish
方法中设置标志即可解决这个问题。
代码如下:
public
class
CycleActivity
extends
Activity {
//true
:窗口退出
false
:窗口切换到后台执行,并没有退出
private
boolean
isFinished
;
protected
void
onStart()
{
Toast.makeText(
this
,
"
窗口已经恢复
"
, Toast.
LENGTH_LONG
).show();
super
.onStart();
}
//
当窗口移到后台执行或退出时执行该方法
protected
void
onStop()
{
//
如果
isFinished=false
,表示当前窗口只是切换到后台运行,并没有退出
if
(!
isFinished
)
{
Toast.makeText(
this
,
"
窗口已经在后台运行(按了
Home
键)!
"
, Toast.
LENGTH_LONG
).show();
}
super
.onStop();
}
//
只要窗口退出,就一定会调用
finish
方法
public
void
finish()
{
//
设置标志
isFinished
=
true
;
super
.finish();
}
}
总结:按
Home
键就相当于将当前程序切换到后台运行,而按
Back
键相当于退出程序,因此该问题也就转换成判断程序是否切换到后台运行的问题。