zoukankan      html  css  js  c++  java
  • 安卓---连续点击两次返回键退出程序---二级界面的退出程序

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

    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.好了下面直接演示怎么样直接在二级界面退出程序

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

     主函数类

    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,则会执行退出的方法。具体我就不写了,可以参考下面的微博

    http://blog.sina.com.cn/s/blog_4fd2a65a0101gg2o.html

  • 相关阅读:
    iOS-runtime-根据协议名调某一个类有与协议里面放的相同的方法
    Mac下显示隐藏文件
    OC开发_整理笔记——多线程之GCD
    兵器簿之cocoaPods的安装和使用
    手写代码UI,xib和StoryBoard间的的优劣比较
    OC开发_Storyboard——MapKit
    smartFloat
    固定浮动侧边栏(SmartFloat)
    一个模拟时钟的时间选择器 ClockPicker
    分布式事务TransactionScope
  • 原文地址:https://www.cnblogs.com/rainday1/p/5444237.html
Copyright © 2011-2022 走看看