Android再按一次完全退出程序及禁止返回上一个界面等

一、Android中的“再按一次返回键退出程序”实现

用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dialog中的按钮。个人觉得“再按一次返回键退出程序”是best practice,实现也很简单,直接上代码: 

private long exitTime = 0;

@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();
            System.exit(0);
        }
        return true;   
    }
    return super.onKeyDown(keyCode, event);
}

 

二、Android再按一次完全退出程序代码

前言:

前面使用的退出程序用的是finish(),它只能退出当前Activity。如果Activity一多就不能一次性退出了。

1、退出应用程序工具类

/**
 * 
 * @author itas109
 * TODO 用于完全退出应用程序 
 */
 
public class ExitAPPUtils extends Application {
    private List activityList = new LinkedList();
    private static ExitAPPUtils instance;
   
    private ExitAPPUtils() {
    }
   
    // 单例模式中获取唯一的ExitAPPUtils实例
    public static ExitAPPUtils getInstance() {
        if(null == instance) {
            instance =new ExitAPPUtils();
        }
        return instance;
    }
   
    // 添加Activity到容器中
    public void addActivity(Activity activity) {
        activityList.add(activity);
    }
   
    // 遍历所有Activity并finish
   
    public void exit() {
        for(Activity activity : activityList) {
            activity.finish();
        }
        System.exit(0);
    }
}

2、使用方法

在每个Activity的onCreate方法里添加如下代码

ExitAPPUtils.getInstance().addActivity(this);

3、实现再按一次完全退出效果

退出代码,放到需要退出的Activity中。

//定义时间
private long exitTime = 0;

//退出代码,放到需要退出的Activity中。

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ 
            if((System.currentTimeMillis()-exitTime) > 2000){ 
                ToastUtils.show(getApplicationContext(), R.string.exit_hint);
            exitTime = System.currentTimeMillis(); 
        } else {
            ExitAPPUtils.getInstance().exit();
            //finish();
            //System.exit(0);
        }
            return true; 
        }
        return super.onKeyDown(keyCode, event);
    }
}

4、效果图

Android再按一次完全退出程序及禁止返回上一个界面等_第1张图片

 

三、禁止返回上一个activity

有时候我们希望从一个activity离开后,按返回键不要再回去(如从登陆界面跳转后,不要再回到登陆界面),那么我们需要把这个activity从栈区中去除。考虑在activity A中调用 activity B,不允许从activity B中返回activity A:在页面跳转的时候使用下面的代码就可以了。

Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(A.this,B.class);
startActivity(intent);

四、Android 只开启一个Activity实例

在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种。 

方法一:设置起动模式 
一个Activity有四种启动模式:standard, singleTop, singleTask, singleInstance。 
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。 
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。 
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。 
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。 

这些启动模式可以在功能清单文件中进行设置,中的launchMode属性。 

方法二:在intent中加标志 
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。 
代码如下:

Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);   
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);   
startActivity(intent);  

五、点击Home键后,在打开应用,应用会重新启动,而不是恢复到原来状态问题处理

android点击Home键后,在打开应用,应用会重新启动,而不是恢复到原来状态,在启动的actiivity中加入如下代码即可解决:

if (!isTaskRoot()) {
   finish();
   return;
}

public boolean isTaskRoot()用来判断该Activity是否为任务栈中的根Activity,即启动应用的第一个Activity。

分析:正常情况下:

比如A页面为启动页面,打开B页面,这时按home键,然后再打开app,这时会在栈中会重新创建一个A页面,然后再打开B页面。

如果加上以上的判断代码:

比如A页面为启动页面,打开B页面,这时按home键,然后再打开app,还会new 一个A页面,但是会走if条件语句,这时A页面不是在栈底,所以finish掉,然后就露出下面的B页面了。

 

 

https://www.cnblogs.com/swx2017/p/7241108.html

https://www.2cto.com/kf/201501/368155.html

https://blog.csdn.net/qq_36464448/article/details/80464075 

https://blog.csdn.net/xiangyong2008/article/details/5782674

https://blog.csdn.net/lzq520210/article/details/52331119

 

 

 

你可能感兴趣的:(android)