Android再按一次完全退出程序及禁止返回上一个界面等
一、Android中的“再按一次返回键退出程序”实现
用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dialog中的按钮。个人觉得“再按一次返回键退出程序”是best practice,实现也很简单,直接上代码:
private long exitTime = 0;@Overridepublic 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、效果图
三、禁止返回上一个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
更多相关文章
- 安全新手入坑——HTML标签
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
- Android一键加群实现
- android Ndk学习笔记01之Hello World!
- android离开一个页面时关闭子线程
- eclipse工具使用技巧&关联Android源码
- Android(安卓)NDK入门实例 计算斐波那契数列二生成.so库文件
- 【Android(安卓)开发教程】FrameLayout帧布局