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键相当于退出程序,因此该问题也就转换成判断程序是否切换到后台运行的问题。