精华内容
下载资源
问答
  • 安卓App的备份与恢复-不定时更新
    千次阅读
    2017-10-23 08:00:07
    更多相关内容
  • 说实话,刚接到这个需求的时候我内心是拒绝的。...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:21
    iPhone 的某个App 设置了隐藏,想要恢复,却找不方法,网上搜了一堆,没有一个有用。笔者这里也不知道如何恢复,最后搞了半天,只能曲线救国了:先把App 删除了,再重新下载,就能把App图标搞出来了。 步骤:设置...

    iPhone 的某个App 设置了隐藏,想要恢复,却找不到方法,网上搜了一堆,没有一个有用。笔者这里也不知道如何恢复,最后搞了半天,只能曲线救国了:先把App 删除了,再重新下载,就能把App图标搞出来了。

    步骤:设置—》通用—》iPhone存储空间—》优酷(找到对应的App)—》点击去,删除或者卸载,最后重新去App Store下载安装,就可恢复。

    具体步骤如图:在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • Android app 后台被杀恢复

    千次阅读 2020-10-12 11:40:15
    adb 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应用退到后台后再打开老是恢复到前台的现象,上网找了下原因是启动模式的问题,如设置了: android:launchMode="singleInstance"  删除掉解决问题。
  • 修复无法连接iPad的App Store

    千次阅读 2021-08-04 02:52:19
    检查苹果的系统页面如果遇到iPad中无法连接到App Store的问题,您应该做的第一件事就是在检查您的互联网连接好吧,尽管听起来很愚蠢,但有时候我们忘记打开互联网并尝试访问App Store。然后导致这个问题。因此,请...
  • 这个App因为包含广告,被苹果要求设置为轻微模拟赌博的分级,否则不能上架或更新,当时的政策就是这样要求的,结果被归类为涉赌类App被一起下架了,此后也不再允许个人开发者上架此类App。 因为这个App用户量很大,...
  • 在这个即将国庆的日子里,碰到这么个神奇的bug;经过查找发现竟然是前人留下来的坑;...不然当你进入后台时,再次重启APP他是进入的MainActivity。然后在singleTask这个属性下是把栈内的除了MainActivity的Activ...
  • 如果禁止App在后台运行iOS上的App类似于Windows上的进程,有几种不同的生存周期:而App中的任何View也有类似的生存周期:如果App处在非活动的状态下,那么接着它进入挂起状态.某些情况下我们可能不希望这样,我们想要当...
  • iOS内付费的功能对于一个app来说是非常重要的,如果在这一环节出了一些致命的问题,那就很可能会影响app的推广和公司的利益了。我在很早之前写过一篇关于iOS内付费的文章(文章地址),在那篇博客中讲述了如何在苹果...
  • #Android开发杂记--如何让App自动更新并跳转至安装界面(完美兼容Android10)引言自动更新App的步骤定义FileProviderFileProvider常见问题解析: 引言        一款发行的app不...
  • iOS之深入解析App的架构设计

    千次阅读 2021-07-20 15:46:34
    具体来说,它关注于两个方面:如何 App 分解为不同的接口和概念层次部件,以及这些部件之间和自身的不同操作中 所使用的控制流和数据流路径。 通常使用简单的框图来解释 App 的架构,比如,Apple 的 MVC 模式可以...
  • 背景介绍WhatsApp是全球最流行的即时通讯软件之一。根据2017年7月的统计数据,其月活跃用户数量达到了13亿。而用户使用其交换的数据可能包含潜在的重要电子数据证据,因此WhatsApp是公检法取证行业中重点关注的应用...
  • 遇到任何问题不要删除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:共享数据存放文件,一般都...
  • Win10Apps是一个免费的Windows10系统APP应用管理器,可以非常方便的卸载和重装安装自带应用。 支持卸载和重装安装的自带应用有: 3D建模、相机、照片、地图、画图3D、天气、便签、财经、新闻、人脉、OneNote、...
  • MacOs 恢复系统后无法更新版本

    千次阅读 2021-01-24 08:50:45
    由于从新安装系统后,本人系统版本10.10.5,在App Store检测更新一直无法检测最新版本。 原来,Mac 随附的 macOS 版本是与该 Mac 兼容的最低版本。 所以我们需要了解自己的系统型号然后自行下载适合自己的系统。 ...
  • iOS开发之内购完全笔记 解决无限提示 --(您已购买此 App 内购买项目。此项目免费恢复。)的问题 梳理内购逻辑 记录个人集成过程中遇到的问题点与大家分享
  • 问题如下: 当内购产品类型为:消耗型项目 ...您已购买此 App 内购买项目。此项目免费恢复。 解决方法:要实现自己的恢复机制。 在使用[[SKPaymentQueue defaultQueue] addPayment
  • 满意答案lclovezw12020.04.09采纳率:52%等级:12已帮助:5930人有很多种办法一般还原网络设置都能恢复但是比较麻烦wifi密码要重新输入了要开机重启所以先重简单的开始退出程序久安home键(中间键)就会出现程序列表往...
  • Apple开发中,在应用中嵌入内购(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...
  • 免费数据恢复软件免激活版!
  • 测试任务开始,检查各项测试资源。 –产品功能需求文档; –产品原型图; –产品效果图; –测试设备; –其他。 4、日报及产品上线报告(内部报告机制) –测试人员每天需对所测项目发送测试日报。
  • 手机禁止安装app,刷机才能恢复

    千次阅读 2019-11-28 10:16:17
    手机禁止安装app,刷机才能恢复 让智能手机安装了必要的app之后,永远禁止安装其他任何app,只有通过刷机才能恢复回来,这个需求对于学生来说很有必要。 比如:安装必要的学习软件,微信,地图导航等等之外,...
  • ios 监听app从后台恢复到前台

    千次阅读 2013-05-16 16:37:56
    ============================================================博文原创,转载请声明出处电子咖啡(原id蓝岩)=========================================================...能够监听从后台恢复到前台- (void)applicati

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,984
精华内容 71,193
关键字:

怎么将app恢复到更新前