用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个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);
}
前言:
前面使用的退出程序用的是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、效果图
有时候我们希望从一个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);
在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种。
方法一:设置起动模式
一个Activity有四种启动模式:standard, singleTop, singleTask, singleInstance。
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
这些启动模式可以在功能清单文件中进行设置,
方法二:在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);
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