利用单例模式,实现Android应用程序的【再按一次退出】

在做一个安卓小程序时,想实现”再按一次退出“的效果,主要是要覆写Activity的onKeyDown方法,判断两次按退出键的时间间隔,当大于某个值时,退出程序。


如果当前的Activity栈中只有一个Activity,则只需要调用finish方法结束这个Activity就行,比如登录页面一般是应该程序的第一个Activity,当在登录页面想实现“再按一次退出”的效果时,只需要在判断完时间后,调用finish方法,如下所示:


@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){  
            if((System.currentTimeMillis()-exitTime) > 2000){  
                Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();                                
                exitTime = System.currentTimeMillis();   
            } else {
            	finish();
            }
            return true;   
        }
        return super.onKeyDown(keyCode, event);
    }

但如果Activity栈中有多个Activity,在结束掉栈顶Activity后,新的栈顶Activity会成为当前的显示页面,程序并没有实现退出的效果,上网找了很多解决办法,如在finish方法后调用System.exit(0);或者杀死进程android.os.Process.killProcess(android.os.Process.myPid());或者自己建立一个管理Activity 的列表;前两个办法试了下不起作用,第三个方法感觉太麻烦没试。


最后联想到最近在软件体系结构学的单例模式,觉得可以用得上,就试了下,成功解决了这个问题。


每次打开一个App,都只有一个App对象,所以单例指的是当前的应用程序

package com.example.lbspractice;

import android.app.Application;

public class MyApplication extends Application{
	
	// 程序退出标记 
	private static boolean isProgramExit = false; 
	private static MyApplication instance;
	
	public MyApplication(){
		
	}
	
	public static MyApplication getInstance(){
		if(instance==null)
			instance = new MyApplication();
		return instance;
	}
	
	public void setExit(boolean exit) { 
		isProgramExit = exit; 
	} 
	 
	public boolean isExit() { 
		return isProgramExit; 
	} 

}



退出的时候设置MyApplication的退出属性

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){  
            if((System.currentTimeMillis()-exitTime) > 2000){  
                Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();                                
                exitTime = System.currentTimeMillis();   
            } else {
            	MyApplication mApp = MyApplication.getInstance(); 
            	mApp.setExit(true); 
            	finish();
            }
            return true;   
        }
        return super.onKeyDown(keyCode, event);
    }

在结束这个Activity后,覆写当前Activity栈中剩余的Activity的onStart方法

@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		MyApplication mApp = MyApplication.getInstance();
		if (mApp.isExit()) { 
			mApp.setExit(false);
			finish(); 
		} 
	}


要注意的是在调用最后一个Activity的finish方法之前要重新把MyApplication的isProgramExit属性设为false,不然在没有清除缓存的情况下,应用程序无法再次开启。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值