导航

Android--点击返回键退出程序

Posted on 2014-10-23 23:08  Stroustrup_Lee  阅读(75)  评论(0)    收藏  举报

现在的应用,为了防止在主界面的误操作,一般在点击返回键的时候都会有退出确认的机制,下面介绍其实现方法:

 

第一种--弹出确认框:

  重写onKeyDown的构造方法监听按键,并判断其按下的是不是返回键,如果是就弹出提示框。

 1  @Override  
 2     public boolean onKeyDown(int keyCode, KeyEvent event) {  
 3         // TODO Auto-generated method stub  
 4         if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0)  
 5         {  
 6             new AlertDialog.Builder(getApplicationContext())  
 7                 .setTitle("退出提示")  
 8                 .setMessage("您确认要退出吗?")  
 9                 .setPositiveButton("确认", new DialogInterface.OnClickListener() {  
10                       
11                     @Override  
12                     public void onClick(DialogInterface dialog, int which) {  
13                         // TODO Auto-generated method stub  
14                         finish();  
15                     }  
16                 }).setNegativeButton("取消", new DialogInterface.OnClickListener() {  
17                       
18                     @Override  
19                     public void onClick(DialogInterface dialog, int which) {  
20                         // TODO Auto-generated method stub  
21                         dialog.dismiss();  
22                     }  
23                 }).show();  
24         }  
25         return super.onKeyDown(keyCode, event);  
26     }  

 

 

第二种--点击两次退出

  A:用Handler进行处理

    

public class MainActivity extends Activity {

    // 定义一个变量,来标识是否退出
    private static boolean isExit = false;

    Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            isExit = false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            exit();
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }

    private void exit() {
        if (!isExit) {
            isExit = true;
            Toast.makeText(getApplicationContext(), "再按一次退出程序",
                    Toast.LENGTH_SHORT).show();
            // 利用handler延迟发送更改状态信息
            mHandler.sendEmptyMessageDelayed(0, 2000);
        } else {
            finish();
            System.exit(0);
        }
    }

}

  B:通过按键的时间差

    

public class MainActivity extends Activity {

    private long lastTime = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            exit();
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void exit() {
        if ((System.currentTimeMillis() - lastTime) > 2000) 
      {
        Toast.makeText(getApplicationContext(),
"再按一次退出程序", Toast.LENGTH_SHORT).show(); lastTime = System.currentTimeMillis();
      }
     else
      {
        finish();
        System.exit(
0);
      }
  }
}

 

  C:通过标志位(转载自:http://www.cnblogs.com/shang53880/p/3578752.html)

    

public class ExitTest extends Activity implements OnClickListener {
15 
16     private Button mExitBtn;
17     private static boolean isExit = false;
18     
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.exit);
23         initView();
24     }
25     
26     private void initView() {
27         mExitBtn = (Button) findViewById(R.id.exit);
28         mExitBtn.setOnClickListener(this);
29     }
30 
31     @Override
32     public void onClick(View v) {
33         switch (v.getId()) {
34         case R.id.exit:
35             exit();
36             break;
37 
38         default:
39             break;
40         }
41     }
42     
43     private void exit() {
44         if(!isExit) {
45             isExit = true;
46             Toast.makeText(this, "在按一次退出程序", Toast.LENGTH_SHORT).show();
47             new Timer().schedule(new TimerTask() {
48                 
49                 @Override
50                 public void run() {
51                     isExit = false;
52                 }
53             }, 2000);
54         } else {
55             finish();
56         }
57     }
58     
59     @Override
60     public boolean onKeyDown(int keyCode, KeyEvent event) {
61         if(keyCode == KeyEvent.KEYCODE_BACK) {
62             exit();
63         }
64         return false;
65     }
66 }