Android长时间及连续两次按BackUp按键退出程序

来源:互联网 发布:校园网络海报 编辑:程序博客网 时间:2024/06/03 17:46

今天自己学习了Android按BackUp按键退出程序的小Demo,发现网上有好多实例,但感觉他们的能解决问题,但可能会存在内存泄漏的问题,今天就自己总结了一下!

分析问题:
1>重写Activity中的onKeyDown()方法
2>定时器其中(Handler、Timer、ScheduledExecutorService)一个或通过时间差
3>一个退出程序的标志

由于我们可能在Activity中开启一些Service,就必须在onDestroy()中释放掉,所以我们必须在Activity.onDescroy()中System.exit(0);来结束进程。不能再onKeyDown()方法中;这样才能避免内存泄漏问题。

Timer实现:

public class MainActivity extends Activity {    private static boolean isExit = false;    private Timer timer = new Timer("zjl");    @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 ) {                 Log.v(TAG, "onKeyDown");                exit();                  return false;              }              return super.onKeyDown(keyCode, event);          }    private void exit() {        if(!isExit){            isExit = true;            Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();            timer.schedule(new TimerTask(){                @Override                public void run() {                    isExit = false;                }            }, 2000);        }else{            finish();        }    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        System.exit(0);    }}

Handler实现:

public class MainActivity extends Activity {    private static boolean isExit = false;    private Timer timer = new Timer("zjl");    private Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            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 ) {              Log.v(TAG, "onKeyDown");             exit();               return false;            }          return super.onKeyDown(keyCode, event);      }    private void exit() {        if(!isExit){            isExit = true;            Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();            mHandler.sendEmptyMessageDelayed(0, 2000);        }        else{            finish();        }    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        System.exit(0);    }}

时间差:

public class MainActivity extends Activity {    private static boolean isExit = false;    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();        }    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        System.exit(0);    }}

注意:当我们长时间按Back键时,不要重写onKeyLongPress()方法,因为我们长时间按时,一直在调用onKeyDown()方法,onKeyLongPress()只调用一次;

下面将分析Android中如何完全退出应用程序

0 0
原创粉丝点击