Android中实现点击两次返回键退出的方法

小编 2026-06-10 阅读:1652 评论:0
法一:实现方式,通过记录按键时间计算时间差实现: 1 2 3 4 5 6 7 8 9 10 11 12...

法一:实现方式,通过记录按键时间计算时间差实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

import android.app.Activity;

import android.os.Bundle;

import android.view.KeyEvent;

import android.widget.Toast;

 

public class MainActivity extends Activity {

 

    private long exitTime = 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() - exitTime) > 2000) {

            Toast.makeText(getApplicationContext(), \"再按一次退出程序\",

                    Toast.LENGTH_SHORT).show();

            exitTime = System.currentTimeMillis();

        else {

            finish();

            System.exit(0);

        }

    }

 

}

演示效果:

\"\"

 

 

到 这里其实就已经实现了,但是很多人的本意并不是在主界面连续点两次返回键退出程序,他们可能进入程序就是登陆界面,在返回的时候不希望返回登陆界面,跳过 它而直接退出程序,这个时候,上面的代码就仅仅只能返回上一个界面,即登陆界面!在我们调试程序的时候发现finish(); System.exit(0);确实让程序有了退出的效果,但是给人一种错觉好像自动重启了,这个要涉及activity的生命周期问题,每个 activity都有自己的生命周期,activity是单独的,用于处理用户操作,所以虽然finish(); System.exit(0);代码执行了,但只是让当前的activity结束了,但是其他还处于活跃期的activity却不会结束,这就是我们所看 到的,好像是返回上一个界面或者软件重启了。

以上纯属个人见解,如果错误欢迎指教。

 关于activity的详细介绍大家可以自行百度,也可以参考这篇文章http://www.cnblogs.com/lyp3314/archive/2011/11/10/2244971.html

2.好了下面直接演示怎么样直接在二级界面退出程序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

import android.app.Activity;

import android.os.Bundle;

import android.view.KeyEvent;

import android.widget.Toast;

 

public class ejjm extends Activity {

 

    private long exitTime = 0;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.ejjm);

    }

 

    @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() - exitTime) > 2000) {

            Toast.makeText(getApplicationContext(), \"再按一次退出程序\",

                    Toast.LENGTH_SHORT).show();

            exitTime = System.currentTimeMillis();

        else {

            finish();

            System.exit(0);

        }

    }

 

}

 主函数类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import android.app.Activity;

import android.os.Bundle;

import android.view.KeyEvent;

import android.widget.Toast;

 

public class MainActivity extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

    btn=(Button) findViewById(R.id.button1);

        btn.setOnClickListener(new OnClickListener() {

             

            @Override

            public void onClick(View arg0) {

                // TODO Auto-generated method stub

                Intent intent=new Intent(MainActivity.this,ejjm.class);

                MainActivity.this.startActivity(intent);

                finish();//这里如果不写finish就会有返回的效果

            }

        });

    }

}

 activity_main.xml和ejjm.xml里面的内容我就不展示了,这里只是做了一个简单的跳转而已,在activity_main.xml只放了一个button而已

演示效果:(想要的画面)

\"\"

 Intent intent=new Intent(MainActivity.this,ejjm.class);

MainActivity.this.startActivity(intent);

finish();//这里如果不写finish就会有返回的效果,而不能退出程序
演示如下:

\"\"

 

法二:实现的基本原理就是,当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法。
在exit方法中,会首先判断isExit的值,如果为false的话,则置为true,同时会弹出提示,并在2000毫秒(2秒)后发出一个消息,在 Handler中将此值还原成false。如果在发送消息间隔的2秒内,再次按了BACK键,则再次执行exit方法,此时isExit的值已为 true,则会执行退出的方法。

 

package com.gaolei.exitdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.widget.Toast;

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);
        }
    }

}

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表