-
2017-10-23 08:00:07
推荐文章
app备份与恢复研究
更多相关内容 -
App手动杀死后重新打开App恢复杀死前的页面
2018-03-17 13:53:04说实话,刚接到这个需求的时候我内心是拒绝的。...1.功能思路 恢复关闭前的页面,是要恢复最后一个Activity的信息,还是恢复整个Activity栈的信息,经需求方要求是恢复所有打开的页面,也就是说恢复整个Ac...说实话,刚接到这个需求的时候我内心是拒绝的。因为从用户角度来讲,我既然手动杀死了就是想关闭这个App,关闭的原因有很多,但是重启后还停留在我最后关闭时的页面就不可理解了。但是需求方是大佬,再不愿意也得做。下面说说思路及实现方式。
1.功能思路
恢复关闭前的页面,是要恢复最后一个Activity的信息,还是恢复整个Activity栈的信息,经需求方要求是恢复所有打开的页面,也就是说恢复整个Activity栈。
Activity列表可以通过我们自己在Application中实现个队列缓存,也可以通过反射获取。这里不详细讲,需要的同学自己搜索一下。
2.实现过程
既然是要恢复,也就需要保存Activity栈信息到本地。但是这里有个问题,即使保存了Activity栈信息,怎么去恢复整个Activity栈呢?直接将Activity栈恢复什么的我是没有找到方法。我们打开Activity是通过Intent打开的,于是退而求其次,保存Intent队列。
那怎么保存Intent?在Application中定义一个全局变量集合,用来缓存Intent。商业项目中Activity都会抽象一个BaseActivity,在BaseActivity中定义一个变量,用来缓存当前Activity的Intent。而后在OnCreate()中获取Intent,将此时获取的Intent存入Application的集合中。OnDestory()时,通过刚才定义的变量Intent去Application的集合中删除该Intent。这样Intent集合跟Activity栈是一致的。
然后startActivity跟startActivityForResult怎么区分呢?
将requestCode信息保存进Intent中,后面通过Intent打开Activity时,判断该值就可以区分了
到这里,基本的缓存策略就完成了,我们手动杀死App时是没有任何生命周期回调的,所以每次保存时
都要将当前的Intent集合保存到本地
保存到本地的方式有很多种,因为我们要保存的是对象,所以我采用对象流的方式保存到文件中
大家都看到那个Exception信息了吧,Intent无法直接通过对象流保存到本地中。于是我定义了一个用来保存Intent信息的bean类
在BaseActivity中的保存Intent操作,将Intent的数据迁移至CacheIntent中
然后再用对象流保存到本地文件中就没问题了。
接下来说一下打开过程,因为欢迎页,及MainActivity是不需要缓存的,所以我选择在MainActivity来初始化缓存的Intent列表及打开Activity。
Application中需要定义一个集合,是用来缓存需要重新打开的Intent的。
在MainActivity调用初始化
将缓存在文件中的数据取出
在MainActivity的OnCreate()最后,开始打开Activity
这里根据自己的需求去做初始化及打开操作,因为我们的MainActivity是没继承BaseActivity的,所以选择在这里初始化,也可以选择在Application的OnCreate()去做初始化操作。
每个Activity打开时,去获取缓存集合的第一个Intent,打开后删除在该集合里的对象。
private void openCacheIntent() { try { List<CacheIntent> cacheIntentList = MyApplication.getContext().getOpenCacheIntentList(); if (cacheIntentList != null && !cacheIntentList.isEmpty()) { CacheIntent cacheIntent = cacheIntentList.get(0); Intent intent = new Intent(); intent.setClassName(this, cacheIntent.getClassName()); intent.setFlags(cacheIntent.getFlags()); intent.setAction(cacheIntent.getAction()); intent.setData(cacheIntent.getData()); Set<String> categorys = cacheIntent.getCategories(); if (categorys != null) { for (String cagetory : categorys) { intent.addCategory(cagetory); } } Map<String, Object> map = cacheIntent.getBundle(); if (map != null) { Set<String> mapKey = map.keySet(); for (String key : mapKey) { Object o = map.get(key); if (o instanceof Byte) { Byte value = (Byte) o; intent.putExtra(key, value); } else if (o instanceof Short) { Short value = (Short) o; intent.putExtra(key, value); } else if (o instanceof Character) { Character value = (Character) o; intent.putExtra(key, value); } else if (o instanceof Integer) { Integer value = (Integer) o; intent.putExtra(key, value); } else if (o instanceof Boolean) { Boolean value = (Boolean) o; intent.putExtra(key, value); } else if (o instanceof Float) { Float value = (Float) o; intent.putExtra(key, value); } else if (o instanceof Long) { Long value = (Long) o; intent.putExtra(key, value); } else if (o instanceof byte[]) { byte[] value = (byte[]) o; intent.putExtra(key, value); } else if (o instanceof short[]) { short[] value = (short[]) o; intent.putExtra(key, value); } else if (o instanceof char[]) { char[] value = (char[]) o; intent.putExtra(key, value); } else if (o instanceof int[]) { int[] value = (int[]) o; intent.putExtra(key, value); } else if (o instanceof float[]) { float[] value = (float[]) o; intent.putExtra(key, value); } else if (o instanceof long[]) { long[] value = (long[]) o; intent.putExtra(key, value); } else if (o instanceof CharSequence) { CharSequence value = (CharSequence) o; intent.putExtra(key, value); } else if (o instanceof CharSequence[]) { CharSequence[] value = (CharSequence[]) o; intent.putExtra(key, value); } else if (o instanceof Parcelable) { Parcelable value = (Parcelable) o; intent.putExtra(key, value); } else if (o instanceof Parcelable[]) { Parcelable[] value = (Parcelable[]) o; intent.putExtra(key, value); } else if (o instanceof Serializable) { Serializable value = (Serializable) o; intent.putExtra(key, value); } } } if (cacheIntent.getRequestCode() > 0) { startActivityForResult(intent, cacheIntent.getRequestCode()); } else { startActivity(intent); } MyApplication.getContext().removeOpenCacheIntent(cacheIntent); } } catch (Exception e) { LogUtil.e(e.getMessage()); } }
欢迎页及MainActivity不做缓存操作,判断一下
Class<? extends BaseActivity> aClass = getClass(); if (!aClass.getName().equals("包名.SplashActivity") && !aClass.getName().equals("包名.GuideActivity")) { saveCacheIntent(); }
欢迎页不做打开操作,跟上面相同,判断一下className就可以了。
最后,如果出现未处理的异常时
class CrashHandler implements Thread.UncaughtExceptionHandler
@Override public void uncaughtException(Thread thread, Throwable ex) { handleException(ex); MyApplication.getContext().clearCacheIntent(); }
在处理函数里,把保存在本地Intent集合数据清除,避免一直打开出现异常的页面,导致无法进入App。
这个做法是很粗糙的,基本实现了功能而已。本地文件也没做加密操作,后续会再完善。如果有哪里做得不对的欢迎大神指点一下。
-
iPhone 隐藏了App 如何恢复
2020-09-23 21:57:21iPhone 的某个App 设置了隐藏,想要恢复,却找不到方法,网上搜了一堆,没有一个有用。笔者这里也不知道如何恢复,最后搞了半天,只能曲线救国了:先把App 删除了,再重新下载,就能把App图标搞出来了。 步骤:设置...iPhone 的某个App 设置了隐藏,想要恢复,却找不到方法,网上搜了一堆,没有一个有用。笔者这里也不知道如何恢复,最后搞了半天,只能曲线救国了:先把App 删除了,再重新下载,就能把App图标搞出来了。
步骤:设置—》通用—》iPhone存储空间—》优酷(找到对应的App)—》点击去,删除或者卸载,最后重新去App Store下载安装,就可恢复。
具体步骤如图:
-
Android app 后台被杀恢复
2020-10-12 11:40:15adb shell am kill-all 应用通过home键已经停留在后台使用,杀掉所有后台程序,需要先将目标程序按home进入后台,然后打开一个其他程序 ps:命令多运行几次 处理Android应用在后台被杀死...android 模拟应用因内存不足被后台杀死命令 https://www.jianshu.com/p/effb4546b9aa
adb shell am kill-all 应用通过home键已经停留在后台使用,杀掉所有后台程序,需要先将目标程序按home进入后台,然后打开一个其他程序
ps:命令多运行几次
处理Android应用在后台被杀死 https://blog.csdn.net/xiao_nian/article/details/79970144
一、背景
我们在使用android app的过程中,可能突然会遇到其他的事情需要将app退到后台,比如微信来了一条消息需要回复,当我们回复完消息在切换回我们的app时,如果处理不好,应用可能会白屏或者闪退。造成这种现象的原因,是android的进程回收机制,android会给每一个应用分配一定的内存,当应用退入后台时,系统并不会将应用杀死,而是将应用缓存起来。打开的应用越多,后台缓存的进程也越多,那么占用的内存也越大,当系统内存不足时,就会根据自己的一套进程回收机制去杀死应用,以便腾出内存空间来分配给其他的应用,后面会详细分析android的进程回收机制。也就是说,当我们将应用退入后台后,应用很可能会因为系统内存不足而被杀死,应用被杀死后,所有的Activity都被销毁了,但是Android也提供了一定的补救措施,activity棧并没有被清空,也就是说如果之前的Activity棧中的内容是A-->B-->C,只是ABC这三个Activity的对象被销毁了,当我们切换应用时,系统首先会重新创建Activity C,由于需要重新创建Activity实例,需要耗费一点时间,所有会有短暂的白屏现象。另外当Activity被意外杀死时,Android会调用Activity的onSaveInstance让开发者去保存应用的数据,在重新创建Activity时,会调用onRestoreInstanceState来恢复应用数据,但是针对大量需要恢复的数据,一旦处理不当,就有可能造成应用闪退,比如,应用在后台被杀死后,所有的静态变量都会被清空,这个时候我们如果直接使用这些静态变量,就会报空指针异常,从而造成程序闪退。
二、解决办法
针对需要恢复的数据比较少的应用,我们可以通过Activity的onSaveInstance和onRestoreInstanceState去恢复,针对静态变量比较多的情况,我们可以考虑采用数据持久化的方式,所有的静态对象都改为单例模式,然后附加上一些持久化cache,空了再取缓存。嗯,这肯定也是一个办法,但是这样的束手束脚对开发来说也是痛苦,一旦处理漏了就会发生空指针异常。我们能不能换一种思路来解决上面的问题,当应用在后台被杀死时,不做Activity棧的恢复,清空Activity棧,并且直接启动应用的第一个Activity,一般是欢迎界面,这样的话,应用就相当于重启了一次,所有的逻辑都会重新开始,也就不存在静态变量为空的问题了,目前很多应用都是这样处理的。那么我们如何判断应用已经被杀死并重新创建了呢?因为静态变量的生命周期和应用的生命周期是一致的,应用被杀死后,静态变量会被回收掉,重新启动静态变量的数据会重新初始化,可以考虑定义在应用中定义一个静态变量,初始值为0,在应用的第一个界面的onCreate方法中将静态变量设置为1,表示应用走的是正常的启动流程,然后写一个基类的BaseActivity,其他的Activity都继承BaseActivity,在BaseActivity的onCreate方法中判断静态变量的值是否为1,如果不为1,则表示应用不是通过正常的流程启动的,则清空Activity棧,并启动第一个Activity。具体代码如下
被后台杀死后,Android应用如何重新走闪屏逻辑 https://www.jianshu.com/p/4fc10026c1f8
Android 后台杀死及恢复的机制 https://juejin.im/post/6844903863422550023
-
Android APP应用退到后台后再打开老是恢复到前台
2016-04-14 17:44:47某天开发过程中,遇到了Android APP应用退到后台后再打开老是恢复到前台的现象,上网找了下原因是启动模式的问题,如设置了: android:launchMode="singleInstance" 删除掉解决问题。 -
修复无法连接到iPad的App Store
2021-08-04 02:52:19检查苹果的系统页面如果遇到iPad中无法连接到App Store的问题,您应该做的第一件事就是在检查您的互联网连接好吧,尽管听起来很愚蠢,但有时候我们忘记打开互联网并尝试访问App Store。然后导致这个问题。因此,请... -
iOS开发 -- 一个被苹果下架的App,终于恢复上架
2021-11-23 21:14:50这个App因为包含广告,被苹果要求设置为轻微模拟赌博的分级,否则不能上架或更新,当时的政策就是这样要求的,结果被归类为涉赌类App被一起下架了,此后也不再允许个人开发者上架此类App。 因为这个App用户量很大,... -
(完美解决)App点击Home键后,再次点击APP图标,APP重启回不到点击home键前的那个界面
2019-09-28 12:57:26在这个即将国庆的日子里,碰到这么个神奇的bug;经过查找发现竟然是前人留下来的坑;...不然当你进入后台时,再次重启APP他是进入的MainActivity。然后在singleTask这个属性下是把栈内的除了MainActivity的Activ... -
如何禁止App在后台运行以及如何保存和恢复App的状态
2016-02-09 10:25:19如果禁止App在后台运行iOS上的App类似于Windows上的进程,有几种不同的生存周期:而App中的任何View也有类似的生存周期:如果App处在非活动的状态下,那么接着它将进入挂起状态.某些情况下我们可能不希望这样,我们想要当... -
iOS 内付费(in-app purchase)--非消耗品的购买与恢复
2016-11-04 00:12:50iOS内付费的功能对于一个app来说是非常重要的,如果在这一环节出了一些致命的问题,那就很可能会影响app的推广和公司的利益了。我在很早之前写过一篇关于iOS内付费的文章(文章地址),在那篇博客中讲述了如何在苹果... -
#Android开发杂记--如何让App自动更新并跳转至安装界面(完美兼容Android10)
2021-03-20 15:58:02#Android开发杂记--如何让App自动更新并跳转至安装界面(完美兼容Android10)引言自动更新App的步骤定义FileProviderFileProvider常见问题解析: 引言 一款发行的app不... -
iOS之深入解析App的架构设计
2021-07-20 15:46:34具体来说,它关注于两个方面:如何将 App 分解为不同的接口和概念层次部件,以及这些部件之间和自身的不同操作中 所使用的控制流和数据流路径。 通常使用简单的框图来解释 App 的架构,比如,Apple 的 MVC 模式可以... -
「电子数据取证」WhatsApp数据恢复提取技术详解
2018-05-31 14:21:00背景介绍WhatsApp是全球最流行的即时通讯软件之一。根据2017年7月的统计数据,其月活跃用户数量达到了13亿。而用户使用其交换的数据可能包含潜在的重要电子数据证据,因此WhatsApp是公检法取证行业中重点关注的应用... -
加密相册、保险箱App打开就闪退、点击提示App Store不提供应用、需要更新才能使用的解决方案
2020-03-30 18:26:05遇到任何问题不要删除App,删除会丢失数据,请先联系技术支持QQ: 673368731,官方技术支持QQ群:961952432,技术支持微博:加密相册,微信公众号:加密相册app 1、加密相册、保险箱在iOS12下打开就闪退的,关闭所有... -
记:实用总结 - 如何找回APP旧版本
2020-05-07 19:31:01在最近开发中,有时候遇到一个问题,抓取APP时待你写好代码以后,过段时间会叫你更新APP版本,而经常造成代码程序不适用导致程序崩溃问题, 所以想着找回以前的app版本。而在生活中,手机上app每隔不久就会提示更新,... -
把AppData目录挪到D盘的方法方法
2022-03-23 14:25:00整个AppData目录挪到D盘方法: 1、AppData Application Data文件位于系统盘(C盘)-> 用户 -> Default 目录下,里面还包含了Locallow、Local、Loaming等文件夹,具体功能如下。 locallow:共享数据存放文件,一般都... -
Windows10预装自带APP卸载和安装win10自带软件恢复
2020-02-11 12:01:13Win10Apps是一个免费的Windows10系统APP应用管理器,可以非常方便的卸载和重装安装自带应用。 支持卸载和重装安装的自带应用有: 3D建模、相机、照片、地图、画图3D、天气、便签、财经、新闻、人脉、OneNote、... -
MacOs 恢复系统后无法更新版本
2021-01-24 08:50:45由于从新安装系统后,本人系统版本10.10.5,在App Store检测更新一直无法检测到最新版本。 原来,Mac 随附的 macOS 版本是与该 Mac 兼容的最低版本。 所以我们需要了解自己的系统型号然后自行下载适合自己的系统。 ... -
iOS开发之内购完全笔记(您已购买此 App 内购买项目。此项目将免费恢复。)
2016-01-16 11:43:07iOS开发之内购完全笔记 解决无限提示 --(您已购买此 App 内购买项目。此项目将免费恢复。)的问题 梳理内购逻辑 记录个人集成过程中遇到的问题点与大家分享 -
此项目将免费恢复。This In-App purchase has already been bought.It will be restored for free.
2016-06-29 16:30:09问题如下: 当内购产品类型为:消耗型项目 ...您已购买此 App 内购买项目。此项目将免费恢复。 解决方法:要实现自己的恢复机制。 在使用[[SKPaymentQueue defaultQueue] addPayment -
iphone无法连接到app store服务器出错怎么办
2021-08-13 06:09:43满意答案lclovezw12020.04.09采纳率:52%等级:12已帮助:5930人有很多种办法一般还原网络设置都能恢复但是比较麻烦wifi密码要重新输入了要开机重启所以先重简单的开始退出程序久安home键(中间键)就会出现程序列表往... -
iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决
2021-01-13 08:54:37Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这... -
一文搞懂App测试,APP测试方案
2021-07-31 17:32:40●测试理论阶段与测试用例设计方法等即适用于WEB产品,也适用于APP产品。 ●理论阶段方法: 等价类 边界值 囚果图 判定表 场景法 流程图 正交法 错误推测法 4.项目阶段适用的测试用例设计方法 ●等价类与边界值组合 ... -
将H5站点打包成app完美攻略
2019-08-22 16:46:00本文介绍了基于HBuilderX,将自主开发的H5网站,使用云打包app的方法,以及打包app过程中,遇到的问题和解决方法。 在HBuilderX中开发的应用,或者第三方的h5应用,可以创建项目,提交到云端打包生成apk(Android... -
8款完全免费的数据恢复软件
2015-07-31 17:10:15免费数据恢复软件免激活版! -
APP测试基本流程以及APP测试要点梳理,保证您看了不后悔!
2020-07-24 11:24:22测试任务开始前,检查各项测试资源。 –产品功能需求文档; –产品原型图; –产品效果图; –测试设备; –其他。 4、日报及产品上线报告(内部报告机制) –测试人员每天需对所测项目发送测试日报。 -
手机禁止安装app,刷机才能恢复
2019-11-28 10:16:17手机禁止安装app,刷机才能恢复 让智能手机安装了必要的app之后,永远禁止安装其他任何app,只有通过刷机才能恢复回来,这个需求对于学生来说很有必要。 比如:安装必要的学习软件,微信,地图导航等等之外,... -
ios 监听app从后台恢复到前台
2013-05-16 16:37:56============================================================博文原创,转载请声明出处电子咖啡(原id蓝岩)=========================================================...能够监听从后台恢复到前台- (void)applicati