针对网上流传的"Android 再按一次后退键退出应用程序"方法改正

来源:互联网 发布:程序员的浪漫'' 编辑:程序博客网 时间:2024/05/16 15:00

    Android中用户要退出应用程序,看到大部分退出应用程序的做法是:弹出一个对话框,用户点了确定后退出。个人觉得这用户体验有点不好,手指还要往屏幕中间移动再点击。用户按了一次后退键,这可能用户是误按了后退键,并不想直接退出程序,给用户提示”再按一次后退键退出应用程序“,如果用户真想退出,直接再按一次后退键即可退出整个应用程序。

 

      网上有好多实现方法,看到大部分人博客转的方法如下:

 

Java代码  收藏代码
  1. private static Boolean isExit = false;  
  2. private static Boolean hasTask = false;  
  3.   
  4. Timer tExit = new Timer();  
  5. TimerTask task = new TimerTask() {  
  6.        
  7.     @Override  
  8.     public void run() {  
  9.         isExit = false;  
  10.         hasTask = true;  
  11.     }  
  12. };  
  13.    
  14. @Override  
  15. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  16.      
  17.     if (keyCode == KeyEvent.KEYCODE_BACK) {  
  18.         if(isExit == false ) {  
  19.             isExit = true;  
  20.             Toast.makeText(this"再按一次后退键退出应用程序", Toast.LENGTH_SHORT).show();  
  21.             if(!hasTask) {  
  22.                 tExit.schedule(task, 2000);  
  23.             }  
  24.         } else {  
  25.             finish();  
  26.             System.exit(0);  
  27.         }  
  28.     }  
  29.     return false;  
  30. }  

 

 

     看这逻辑,测试了下,如果用户第一次按了后退键,等2s再按一次后退键,再等2s再按一次后退键,第三次就直接退出了。看来这段代码只能实现用户第一次按后退键,2s之内再按后退键退出程序的功能而已。

 

     我把它改了下:

 

Java代码  收藏代码
  1.     private static Boolean isExit = false;  
  2.       
  3.     Timer tExit = new Timer();  
  4.   
  5.     MyTimerTask  task;  
  6.     class MyTimerTask  extends TimerTask{    
  7.     @Override  
  8.       public void run() {  
  9.          isExit = false;  
  10.   
  11.       }   
  12.     }      
  13.   
  14.    @Override  
  15.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  16.           
  17.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
  18.             if(isExit == false ) {  
  19.                 isExit = true;  
  20.                 Toast.makeText(this"再按一次后退键退出应用程序", Toast.LENGTH_SHORT).show();  
  21.                 if(task!=null)  
  22.                     task.cancel(); //将原任务从队列中移除  
  23.                task = new MyTimerTask();// 新建一个任务        
  24.                        tExit.schedule(task, 2000);  
  25.             } else {  
  26.                 finish();  
  27.            System.exit(0);  
  28.             }  
  29.        }  
  30.          return false;  
  31.    }  

 

 

    以上经常测试,功能正常。

 

    还有一种简便方法:

 

Java代码  收藏代码
  1. private long exitTime = 0;  
  2.   
  3. @Override  
  4. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  5.     if(keyCode == KeyEvent.KEYCODE_BACK  
  6.             && event.getAction() == KeyEvent.ACTION_DOWN){  
  7.         if((System.currentTimeMillis()-exitTime) > 2000){  
  8.             Toast.makeText(getApplicationContext(), "再按一次后退键退出程序", Toast.LENGTH_SHORT).show();  
  9.             exitTime = System.currentTimeMillis();  
  10.         } else {  
  11.             //退出代码  
  12.         }  
  13.         return true;  
  14.     }  
  15.     return super.onKeyDown(keyCode, event);  
  16. }     
原创粉丝点击