在Andorid5.0之后,在开发者选项中有一项 不保留活动(用户离开后立即清除每个活动)

这是什么意思呢? 假如你从A 界面跳转到B界面。 这个时候你再按返回键,是直接退出了整个应用程序。意思就是销毁非当前可视化的界面
我研究过几个APP(美团外卖,百度外卖等APP),他们的做法是当你按返回键的时候,重新跳转到A界面。
解决方案:
利用栈解决,关于栈,它是一种先进后出的概念。其实每一个显示在用于眼前的Activity就是出于栈顶的位置。(这里就不对栈多做概述)
首先来看一下核心类: 用来管理所有的Activity
public class AppManager {private static Stack<Activity> activityStack;private static AppManager instance;private AppManager() {}/*** 单一实例*/public static AppManager getAppManager() {if ( instance == null) {instance = new AppManager();}return instance;}/*** 添加Activity到堆栈*/public void addActivity(Activity activity) {if ( activityStack == null) {activityStack = new Stack<Activity>();}activityStack.add(activity);}/*** 获取当前Activity(堆栈中最后一个压入的)*/public Activity currentActivity() {Activity activity = activityStack.lastElement();return activity;}/*** 结束当前Activity(堆栈中最后一个压入的)*/public void finishActivity() {Activity activity = activityStack.lastElement();if (activity != null) {finishActivity(activity);}}/*** 结束指定的Activity*/public void finishActivity(Activity activity) {if (activity != null) {activityStack.remove(activity);activity.finish();activity = null;}}/*** 结束指定类名的Activity*/public void finishActivity(Class<?> cls) {for (Activity activity : activityStack) {if (activity.getClass().equals(cls)) {finishActivity(activity);}}}/*** 结束所有Activity*/public void finishAllActivity() {for ( int i = 0, size = activityStack.size(); i < size; i++) {if ( null != activityStack.get(i)) {activityStack.get(i).finish();}}activityStack.clear();}/*** 退出应用程序*/public void AppExit(Context context) {try {BaseApplication. myLoginState= false;BaseApplication. isEnterMain= false;BaseApplication. currentPhotoPath= "";finishAllActivity();ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE );activityMgr.killBackgroundProcesses(context.getPackageName());System. exit(0);} catch (Exception e) {}}/*** 得到当前类名*/public String  getClassName(Context context){ActivityManager manager = (ActivityManager)context.getSystemService(Context. ACTIVITY_SERVICE);List<RunningTaskInfo> runningTasks = manager .getRunningTasks(1);   RunningTaskInfo cinfo = runningTasks.get(0);   ComponentName component = cinfo. topActivity;   return component.getClassName();}

你的每一个Activity应该继承自定义父类的BaseActivity,在BaseActivity的onCreate()方法中加入这行代码:
AppManager. getAppManager().addActivity( activity ); //将当前的activity对象加入到栈的集合当中去
接着,重写父类BaseActivity的onKeyDown
 @Overridepublic boolean onKeyDown( int keyCode, KeyEvent event) {//在这里就要先得到Activity栈里面的倒数第二个元素(比如在这之前是从A跳转到B。那么stack集合里面的元素为{X,X,X,A,B}),然后判断A是否被finish();Activity activityA=AppManager.getAppManager().getActivityStack().get(AppManager. getAppManager().getActivityStack().size()-2); //因为数组下标是从0开始,所以要减去2才能得到Aif(activityA.isFinishing()){ //判断A activity是否被销毁,如果被销毁,则进行跳转操作,如果没有被销毁,则不操作Activity activityB=AppManager.getAppManager().getActivityStack().get(AppManager. getAppManager().getActivityStack().size()-1);AppManager.getAppManager().getActivityStack().remove(AppManager. getAppManager().getActivityStack().size()-2); //将A移除stack集合中AppManager.getAppManager().getActivityStack().remove(AppManager. getAppManager().getActivityStack().size()-1); //将B移除stack集合中startActivity( new Intent(activityB,activityA.getClass()));//从B跳转到Areturn true;}return super.onKeyDown(keyCode, event);}
这样,就对每一个继承了父类的BaseActivity做了预处理了。
但是这里还是会有一些问题。
比如:我从A 跳转到B,再从B跳转到C。  在这个过程中,我的程序要求,B跳转到C的时候要销毁B。 这个时候在B中startActivity的时候要将B从stack集合中移除出去
 AppManager.getAppManager().finishActivity(B_activity);

Android5.0之后打开开发者选项中的不保留活动,解决方案相关推荐

  1. android 不保留活动,Android5.0之后打开开发者选项中的不保留活动,解决方案

    在Andorid5.0之后,在开发者选项中有一项 不保留活动(用户离开后立即清除每个活动) 这是什么意思呢? 假如你从A 界面跳转到B界面. 这个时候你再按返回键,是直接退出了整个应用程序.意思就是销 ...

  2. Android系统默认打开开发者选项中的TP触摸开关

    在定制系统开发中,有时会遇到客户为了方便生产测试硬件主板,客户会提出生产测试软件需要默认打开开发者选项中的TP触摸开关,也就是show_touches和pointer_location 具体实现方法如 ...

  3. Android9.0默认将开发者选项中的OEM锁开关打开

    做项目时偶尔会遇到客户需求中有这样的要求:默认将开发者选项中的OEM锁开关打开 修改这个需求可以: 到frameworks/base/services/usb/java/com/android/ser ...

  4. android 9.0 默认打开开发者选项显示

    在开机初始化脚本中增加如下命令 settings put global  development_settings_enabled 1

  5. Android开发者选项中,这29个功能你忽略了吗?

    前言 1.Android的开发者选项对于每个开发人员来说,肯定再熟悉不过了. 一个设备,如果你不打开开发者选项中的USB调试,那么连接到电脑上是不显示该设备的,也无法直接把程序运行到设备上,没法调试, ...

  6. MTK6757 9.0 USB debugger 默认打开, 开发者选项无法打开

    一. USB debugger 默认打开 1. build\make\core\main.mk 将ro.debuggable 值改为1 ADDITIONAL_DEFAULT_PROPERTIES += ...

  7. 开发打开设置洁面_用了两到三年的华为手机,一键打开开发者选项,帮助性能加速...

    用了两到三年的华为手机,可以一键打开"开发者选项",帮助性能加速 我们手机用了两到三年,速度和刚买的时候相比,明显是变慢了一大截.今天笔者就带来一个华为手机的使用小技巧,华为开发者 ...

  8. 小米3 打开开发者选项

    小米3 打开开发者选项 进入设置界面,点击关于手机选项,如下图: 点击四次版本号! 然后就打开了开发者选项了. 点击返回键就能看到设置中多了开发者选项,如下图: 点击开发者选项就可以进入设置USB调试 ...

  9. 怎么用计算机打开开发者模式,win10如何打开开发者选项模式

    我们的win10系统中自带有开发者选项模式,该模式为Win10技术预览版开发此风格应用你需要开启"开发者模式",开启之后,在将应用提交给微软进行测试和认证前,你可以先在本地计算机上 ...

最新文章

  1. 3维DEMO: 抽奖圆盘
  2. 【转】hex和bin文件格式的区别
  3. 利用钥匙串,在应用里保存用户密码的方法
  4. 特征提取——HOG方向梯直方图
  5. vh,vw单位你知道多少?
  6. linux启动tongweb命令,linux7开机自启动东方通tongweb
  7. adb interface找不到驱动程序_Windows 10现支持更多设备的驱动程序更新
  8. MyEclipse 2014下搭建Android开发环境
  9. 【Linux】Linux JSON 格式化输出
  10. sqlserver 没有维护计划_设定数据库备份计划,安全放心不怕事!
  11. java生成微信小程序二维码,前台扫描识别
  12. 计算机高一基础知识大全,计算机基础知识大全
  13. idea在mac版怎么配置svn_idea配置svn的步骤
  14. C++中vector初始化
  15. 赵小楼《天道》《遥远的救世主》深度解析(33)从芮小丹买音响说说精神供应和精神绝症
  16. 数据挖掘(一)A-Priori
  17. 使用 JMeter的性能测试
  18. Oracle用户密码输错次数超过后被锁定LOCKED(TIMED)
  19. 就业感言:纸上得来终觉浅,绝知此事要躬行
  20. WPF 控件专题 Grid 控件详解

热门文章

  1. python显示文件夹图片_python遍列目录搜索文件夹及子文件夹图片文件
  2. 使用百度API实现热点(WIFI)、GPS、基站定位
  3. 通过LR给随手拍的静物照片进行小清新色调的调色
  4. ASM磁盘空间假装耗尽,ORA-15041: diskgroup space exhausted
  5. 【18-业务开发-基础业务-商品模块-分类管理-前后端管理系统的启动-为分类管理表增加数据-Json插件的下载-返回具有层级目录、父子关系结构的数据】
  6. Java简史-SUN
  7. android 截屏 简书,Android 内置应用截屏方法
  8. matlab中m_map工具箱绘制大圆航线
  9. mysql:mysql数据库下载及安装(详细)
  10. 如何离线在itpub上发表博文