Android中用户要退出应用程序,看到大部分退出应用程序的做法是:弹出一个对话框,用户点了确定后退出。个人觉得这用户体验有点不好,手指还要往屏幕中间移动再点击。用户按了一次后退键,这可能用户是误按了后退键,并不想直接退出程序,给用户提示”再按一次后退键退出应用程序“,如果用户真想退出,直接再按一次后退键即可退出整个应用程序。
网上有好多实现方法,看到大部分人博客转的方法如下:
- privatestaticBooleanisExit=false;
- privatestaticBooleanhasTask=false;
- TimertExit=newTimer();
- TimerTasktask=newTimerTask(){
- @Override
- publicvoidrun(){
- isExit=false;
- hasTask=true;
- }
- };
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent){
- if(keyCode==KeyEvent.KEYCODE_BACK){
- if(isExit==false){
- isExit=true;
- Toast.makeText(this,"再按一次后退键退出应用程序",Toast.LENGTH_SHORT).show();
- if(!hasTask){
- tExit.schedule(task,2000);
- }
- }else{
- finish();
- System.exit(0);
- }
- }
- returnfalse;
- }
看这逻辑,测试了下,如果用户第一次按了后退键,等2s再按一次后退键,再等2s再按一次后退键,第三次就直接退出了。看来这段代码只能实现用户第一次按后退键,2s之内再按后退键退出程序的功能而已。
我把它改了下:
- privatestaticBooleanisExit=false;
- TimertExit=newTimer();
- MyTimerTasktask;
- classMyTimerTaskextendsTimerTask{
- @Override
- publicvoidrun(){
- isExit=false;
- }
- }
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent){
- if(keyCode==KeyEvent.KEYCODE_BACK){
- if(isExit==false){
- isExit=true;
- Toast.makeText(this,"再按一次后退键退出应用程序",Toast.LENGTH_SHORT).show();
- if(task!=null)
- task.cancel();//将原任务从队列中移除
- task=newMyTimerTask();//新建一个任务
- tExit.schedule(task,2000);
- }else{
- finish();
- System.exit(0);
- }
- }
- returnfalse;
- }
以上经常测试,功能正常。
还有一种简便方法:
- privatelongexitTime=0;
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent){
- if(keyCode==KeyEvent.KEYCODE_BACK
- &&event.getAction()==KeyEvent.ACTION_DOWN){
- if((System.currentTimeMillis()-exitTime)>2000){
- Toast.makeText(getApplicationContext(),"再按一次后退键退出程序",Toast.LENGTH_SHORT).show();
- exitTime=System.currentTimeMillis();
- }else{
- //退出代码
- }
- returntrue;
- }
- returnsuper.onKeyDown(keyCode,event);
- }