首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

保留的片段和在后台被杀死的活动

在Android开发中,"保留的片段"(Retained Fragments)和"在后台被杀死的活动"(Activities Killed in Background)是两个重要的概念,涉及到应用的生命周期管理和内存优化。

保留的片段(Retained Fragments)

基础概念

保留的片段是一种特殊的片段,它在配置更改(如屏幕旋转)时不会被销毁,而是保持其状态。这使得它非常适合用于保存需要在配置更改期间持久化的数据。

优势

  1. 状态保持:在屏幕旋转或其他配置更改时,保留的片段可以保持其状态,避免重新初始化。
  2. 数据持久化:适合用于保存需要在配置更改期间持久化的数据,如网络请求的结果。

类型

  • 标准保留片段:通过设置setRetainInstance(true)来创建。
  • ViewModel:在Android Architecture Components中,ViewModel是一种更现代的方式来处理状态保留。

应用场景

  • 长时间运行的任务:如网络请求,可以在保留的片段中进行,避免因配置更改而重新发起请求。
  • 复杂UI状态管理:如复杂的表单或动画状态。

示例代码

代码语言:txt
复制
public class MyRetainedFragment extends Fragment {
    private MyData mData;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public void setData(MyData data) {
        mData = data;
    }

    public MyData getData() {
        return mData;
    }
}

在后台被杀死的活动(Activities Killed in Background)

基础概念

当应用进入后台并且系统需要回收内存时,Android可能会杀死一些活动(Activities)。这是为了优化系统资源的使用。

原因

  1. 内存压力:当系统内存不足时,会优先杀死最近最少使用的活动。
  2. 配置更改:如屏幕旋转,系统会销毁并重新创建活动。

解决方法

  1. 使用ViewModel:ViewModel可以在配置更改时保持数据,避免重新初始化。
  2. 保存实例状态:在onSaveInstanceState中保存关键数据,并在onCreateonRestoreInstanceState中恢复。
  3. 使用持久化存储:如SharedPreferences或数据库,保存关键数据。

示例代码

代码语言:txt
复制
public class MyActivity extends AppCompatActivity {
    private MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewModel = new ViewModelProvider(this).get(MyViewModel.class);

        if (savedInstanceState != null) {
            // 恢复实例状态
            String savedData = savedInstanceState.getString("key");
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // 保存实例状态
        outState.putString("key", "someData");
    }
}

通过合理使用保留的片段和ViewModel,可以有效管理应用的状态,避免因配置更改或后台杀死活动而导致的数据丢失问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

别让祖国的花朵,被蓝鲸杀死

据悉,该游戏源于俄罗斯,参与者多为10-14岁的青少年。他们被要求跟随“导师”一一完成列表上的项目,如凌晨4:20起床看恐怖片,静脉切割,半夜爬到屋顶,用剃刀在手上雕鲸鱼等。...凡是参与此次游戏的参与者无一幸免,已有130名俄罗斯青少年选择了自杀。 ? 我们在惋惜的同时,不禁产生了一丝疑问:为何花一样年纪的青少年们会选择如此极端的方式结束自己的生命?...真如网友所调侃的那样是因为“作业太少,闲的发慌”?其实不然。10-14岁的青少年正处于青春的叛逆期,独立和自我意识日益增强,他们急欲通过一些极端的事情来证明自己或者摆脱成人的监护。...而这种来自校园同学的边缘化,使得青少年愈加沉溺于网络。 被唤醒的死亡本能 谈完外在原因之后,我们再来说说内在因素。弗洛伊德后期思想认为,人有两种本能,一是爱的本能(或为性本能),二是死亡本能。...哀乐响起,进行贡果礼、盖感恩被、默哀、献花等祭奠仪式后,再安睡在棺材中。这种类型的“死亡体验”活动在沈阳、上海、天津、重庆等地受到热捧,时常客满。 ?

82860

PostgreSQL - 如何杀死被锁死的进程

前言 在一次系统迭代后用户投诉说无法成功登陆系统,经过测试重现和日志定位,最后发现是由于用户在ui上进行了某些操作后,触发了堆栈溢出异常,导致数据库里的用户登陆信息表的数据被锁住,无法释放。...这个表里存放的是用户的session信息。 虽然后来解决了问题,但是数据库里这个用户登录信息表里被lock住的数据始终无法释放,这导致用户永远无法登陆成功,需要手动跑SQL把锁去掉才行。...杀掉指定进程 PostgreSQL提供了两个函数:pg_cancel_backend()和pg_terminate_backend(),这两个函数的输入参数是进程PID,假定现在要杀死进程PID为20407...); 这两个函数区别如下: pg_cancel_backend() 只能关闭当前用户下的后台进程 向后台发送SIGINT信号,用于关闭事务,此时session还在,并且事务回滚 pg_terminate_backend...() 需要superuser权限,可以关闭所有的后台进程 向后台发送SIGTERM信号,用于关闭事务,此时session也会被关闭,并且事务回滚 那么如何知道有哪些表、哪些进程被锁住了?

2K20
  • 解决运动单例造成Fragment状态被保留的问题

    视图保存,finish后也不新构建:   其实Activiyt、Fragment都是重新构建了的。不过由于对BottomSelectView采取单例构建数据的方式。如果对构建数据做了null判断。...第二次重新构建Activity的时候,数据由于存在于单例中,他的各种状态、Fragment都被保存了下来,导致页面展示的和销毁前一直。   ...解决:每次构建数据的时候,都重新构建 加载动画show的时候actiivy已经被销毁   由于做了加载动画的Util类。采用了单例的设计,保证不会多次创建。...但是在单例中用了全局的Context,导致Activity被销毁后,还是用的他的Context然后报错。   解决:不要用全局的Context,在每个需要Context的方法中,传入。

    59410

    iOS app处于后台被杀死的状态仍可进行语言播报(iOS12.1以上在后台或者被杀死无法语音播报的解决方案)

    /u011018979/14026303 1、原文:https://kunnan.blog.csdn.net/article/details/103702284 2、本文提供iOS12.1系统以上在后台或者被杀死无法语音播报的解决方案...:通过NotificationServiceExtension实现 想要消息推送的消息在Service Extension中被处理,需要aps 内容中包含mutable-content : 1....(以极光平台推送为例,测试的时候,需要在高级设置开启mutable-content) aps = { alert = { body = 11; subtitle...; }; badge = 1; "mutable-content" = 1; sound = default; }; hasHandled = 1; //标记已经在Extension中被处理,防止重复的语言播报或者打印交易小票等冗余动作...} 正确的消息推送格式 {"aps":{"alert":"This is some fancy message."

    1K31

    后台设计中容易被忽略的坑

    1.数据关联性删除判断   示例:比如后台发布了一个待抢购的订单,app已经把此单抢购,因为后台没有及时刷新状态,所有如果要删除或下架此笔订单,必须先要验证此订单的状态是否为已经抢购; 2.数据重复录入问题...  示例:新增数据的时候,由于网络卡顿原因,提交按钮我重复点击n次,就会发送n次请求,录入n条相同的数据,所有在第一次请求之前,先要把提交按钮设置不可编辑,等待返回结果之后再进行后续操作; 3.表单数据验证...  表单验证的时候要验证数据库关键字符的处理,比如英文单引号(')就要做非法关键字提示; 4.千万不要在循环中查询数据库   循环本来就就意味者数据量会很大,所有要尽量避免在循环中查询数据库,解决方案...,把需要查询的集合一次性查询出来放到内存或缓存介质中,然后在for循环的时候,从内存或缓存集合中查询,经历减少数据库查询浪费的资源和消耗不必要的时间;

    1.2K100

    宋宝华: 僵尸进程的成因以及僵尸可以被“杀死”吗?

    僵尸不可能被杀死,因为它已经死了,不存在再死一次的问题。死的对立面是活,死者已死。只有活的进程才可能被杀死。...之后,4578会消失,因为父进程执行到了wait,也知道了子进程是被信号2杀掉的。...这个时候我们能够把僵尸消失掉的方法,就是杀死僵尸进程的父进程4627。 一个僵尸可以被杀死的假象 下面的这个程序证明“僵尸可以被杀死”: ?...那么,根据POSIX标准关于信号(signal)的定义,当我们执行kill -9 4730(4730是4730和4731的TGID,也是整个进程用户态视角的PID)的时候,是要杀死整个4730进程的,所以这个时候...所以,在本例中,kill -9 4730看起来是"杀死了僵尸”,实际是杀死了4730整个进程(里面的每个线程),导致整个进程死。在次之前,整个进程实际还是活的。

    1.7K20

    Android后台杀死系列之四:Binder讣告原理Binder讣告的注册入口死亡通知的发送

    Binder是一个类似于C/S架构的通信框架,有时候客户端可能想知道服务端的状态,比如服务端如果挂了,客户端希望能及时的被通知到,而不是等到再起请求服务端的时候才知道,这种场景其实在互为C/S的时候最常用...Binder“讣告”发送的入口只有一个:在释放binder设备的时候,在在操作系统中,无论进程是正常退出还是异常退出,进程所申请的所有资源都会被回收,包括打开的一些设备文件,如Binder字符设备等。...wake_up_interruptible(&ref->proc->wait); } ... } 死亡讣告被直接发送到Client...端的binder进程todo队列上,这里似乎也只对于互为C/S通信的场景有用,当Client的binder线程被唤醒后,就会针对“讣告”做一些清理及善后工作: static int binder_thread_read...作者:看书的小蜗牛 原文链接: Android后台杀死系列之四:Binder讣告原理 参考文档 Android Binder 分析——死亡通知(DeathRecipient)

    1.5K40

    谷歌10M上下文窗口正在杀死RAG?被Sora夺走风头的Gemini被低估了?

    很多测试过 Gemini 1.5 Pro 的人都表示,这个模型被低估了。...一位 X 网友表示,在他进行的一个测试中,支持超长上下文的 Gemini 1.5 Pro 确实做到了 RAG 做不到的事情。 RAG 要被长上下文模型杀死了?...「一个拥有 1000 万 token 上下文窗口的模型让大多数现有的 RAG 框架都变得不那么必要了,也就是说,1000 万 token 上下文杀死了 RAG,」爱丁堡大学博士生符尧在评价 Gemini...但很多人都表示,作为一个超长上下文窗口模型,Gemini 1.5 Pro 确实被低估了。@elvis 也给出了他的测试结果。...正确的回答应该是「~1e24 FLOPs」。技术报告中包含了许多例子,说明当被问及有关视频的具体问题时,这些长上下文模型会出现失误。 下一项任务是从视频中提取表格信息。

    18310

    如何让你的app在后台被干掉后优雅的启动

    这个是activity的生命周期: ? 就不多介绍这个生命周期了,相信都熟悉不过了,有想了解的自行Google或者百度吧。 重点 接下来是我们的重点:程序如果在后台被杀死之后,我们怎么去处理?...首先,我们得知道,为什么程序会在后台被干掉的?我们又没有手动关闭程序。 app在后台被强杀,是在内存不足的情况下被强制释放了,也有一些恶心的rom会强制杀掉那些后台进程以释放缓存以提高所谓的用户体验。...(注:当你的代码写得混乱、冗余,而且非常消耗内存的时候,那你的app在后台运行时将会比较容易被系统给干掉的,所以从现在开始要约束自己要养成良好的编码习惯和注意内存泄漏的问题) 我们都觉得android...public static final intSTATUS_FORCE_KILLED = -1;//应用放在后台被强杀了 public static final intSTATUS_NORMAL =...当应用被杀死之后,所有数据都会被回收,所以之前设置的app status也会置于默认状态,即杀死状态,所以再次打开app的时候,status为杀死状态,就会走重启的流程,这里为什么要先跳转到MainActivity

    2.6K20

    Android内存管理(六)Android对Linux系统的内存管理机制进行的优化

    Android系统回收后台进程的参考条件: LRU算法:自下而上开始终止,先回收最老的进程。越老的进程近期内被用户再次使用的几率越低。杀死的进程越老,对用户体验的影响就越小。...这类进程会被保存在一个伪LRU列表中,系统会优先杀死处于列表尾部(最老)的进程,以确保包含用户最近查看的 Activity 的进程最后一个被终止。...保留这种进程的的唯一目的是用作缓存(为了更加有效的使用内存而不是完全释放掉),以缩短下次启动应用程序所需的时间,因为启动一个新的进程也是需要代价的。只要有需要,Android会随时杀死这些进程。...Home键退出和返回键退出的区别 Home键退出,程序保留状态为后台进程;而返回键退出,程序保留状态为空进程,空进程更容易被系统回收。Home键其实主要用于进程间切换,返回键则是真正的退出程序。...从理论上来讲,无论是哪种情况,在没有任何后台工作线程(即便应用处于后台,工作线程仍然可以执行)的前提下,被置于后台的进程都只是保留他们的运行状态,并不会占用CPU资源,所以也不耗电。

    1.6K10

    iOS 前台重启应用和清除角标的问题已知条件:问题描述:调试分析解决问题

    或者应用在前台时被强制关闭时执行 - (void)applicationDidEnterBackground:(UIApplication *)application { //给处于后台的应用添加毛玻璃效果...,不但能保留以前的通知内容,还有角标消失动画,iOS10之前这样设置是没有作用的 ,iOS10之后才有效果 。...,加载的启动屏是退入后台时的应用截屏。.../这个发送本地通知的操作是为了解决在iOS10之前清除角标的同时可以保留通知内容的问题 //这个清除角标的操作只在进入后台时执行才会造成:应用在前台时被强制关闭后,立马重启应用后会调用方法applicationWillEnterForeground...;置为-1的话,不但能保留以前的通知内容,还有角标消失动画,iOS10之前这样设置是没有作用的 ,iOS10之后才有效果 。

    1.8K30

    Android 进程的五种生命周期学习

    本节学习进程的生命周期: Android系统是尽可能的去保护每一个进程,但是最终需要为新的进程,或者很重要的进程释放以前的老进程。为了决定那个进程被保护,那个被杀死。...Android系统根据当前进程中组件的状态,以及运行在进行中的组件决定保留那个,杀死那个进程。当然了系统资源短缺时,进程等级低的先杀死,以此类推。...虽然服务用户是看不见的,但是服务进程却可以干一些很重要的事情(比如在后台播放音乐,下载东西),服务进程一般是不可能杀死的。...除非系统资源不够,会杀死服务进程。但是当系统资源充足时,系统会自动启动被杀死的服务进程。...4:后台进程:      拥有一个用户看不见的Activity的进程,此时Activity的onStop方法被调用 5: 空进程:       没有任何活动的应用组件的进程       空进程很容易被杀死的

    44920

    Android基础部分再学习---activity的生命周期

    关于activity的生命周期:要知道的知识点 1.每个生命活动执行的顺序、 2.每个生命周期我们应该做怎么样的处理:每个方法保留的时间有多久;那个方法是活动阻塞的,他没有做完,别的人做不了;那个方法让我们暂时回收内存...例如,如果你的活动有一个线程在后台运行下载网络数据,它可以在onCreate()中创建该线程【一般在onStart里面创建更好子线程,主要是onCreate()只有5秒的响应时间】,然后在onDestroy...当一个Activity在Resumed状态下,它是不会因内存不够而被系统直接杀死(在极端的情况下也有可能被杀死,但是一般不会考虑这种情况)。...事件里面写 startacitivity的时候,在前面执行finish方法和在后面执行finish方法,他们影响不大,因为他们都是异步的过程 他会把所有的异步代码全部执行了,然后再去执行startActivity...3、onStart和onRestart、onStop Activity进入到Stopped状态之后,它极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory

    91520

    速读原著-Android应用开发入门教程(Android应用程序的概念性描述)

    (4)后台(Background)进程 拥有一个当前用户看不到的 Activity(它的 onStop()方法被调用),这些进程对用户体验没有直接的影响。...保留这种进程的唯一原因是,当下次应用程序的某个组件需要运行时,不需要重新创建进程,这样可以提高启动速度。...活动被“覆盖”的情景:Android 的活动一般都占据一个完整的屏幕,从当前活动启动另外一个活动时,另一个活动将被启动到前台(Foreground),当前活动转入后台(Background),这时活动的...在转入后台时,onStop()是否被调用取决于活动是否被完全覆盖,在新的活动有透明部分时,转入后台的活动依然“可见”,其他情况下(较多数的情况)活动均进入不可见状态(被完全覆盖)。...如果系统缺少内存时,也会杀死(kill)后台的活动,其中优先杀死不可见的活动,可见的活动一般不会被杀死。 2.

    1K10

    【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类成员方法 )

    文章目录 一、Proguard 默认混淆结果 二、Proguard 保留类及成员混淆结果 三、Proguard 保留注解以及被注解修饰的类/成员/方法 更多 ProGuard 混淆配置参考 : https...类名 -keep public class kim.hsl.handler.MainActivity 混淆结果如下 : 可以看到 MainActivity 类名被保留下来 , 成员由于没有配置 , 因此被混淆了...{ *; } 由下图可以看出 , 成员变量 , 成员方法 的名称都保存下来了 ; 三、Proguard 保留注解以及被注解修饰的类/成员/方法 ---- 创建注解 : package kim.hsl.handler...; public @interface Keep { } ProGuard 中配置 保留该注解 , 以及 被该注解修饰的类 ; # 保留 Main 类及成员 -keep public class kim.hsl.handler.Main...# 保留 Keep 注解 -keep public class kim.hsl.handler.Keep # 保留被 Keep 注解修饰的类 -keep @kim.hsl.handler.Keep

    1.9K00

    大话企业级android读书笔记(二)

    一个活动在onCreate()中做所有的“全局”状态的初始设置,在onDestroy()中释放所有保留的资源。...在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause(),当一个活动返回或一个新的意图被传输时调用onResume()。...图1、活动生命周期(来源:Android SDK) 下面的表格对每个方法更详细的描述和在活动的整个生命周期中的定位。 ? ?...注意上面表格的Killable列,它表示当方法返回时没有执行活动的其它代码,系统是否能杀死活动寄宿的进程。三个方法(onPause()、onStop()、onDestroy())标记为Yes。...因为onPause()是唯一一个保证在进程被杀之前会调用的,因此你应该使用onPause()来写任何持久化存储数据。 被标记为No的方法保护活动寄宿的进程在他们调用的时候不会被杀掉。

    1K50

    iOS12.1以上在后台或者被杀死无法语音播报的解决方案:用NotificationServiceExtension实现【修订】

    download/u011018979/14026303 1、原文:https://kunnan.blog.csdn.net/article/details/103702284 2、本文提供iOS12.1系统以上在后台或者被杀死无法语音播报的解决方案...本文就是利用Service Extension处理消息并语言播报,来解决iOS12.1系统以上在后台或者被杀死无法语音播报的问题 想要消息推送的消息在Service Extension中被处理,需要...本文就是利用Service Extension处理消息并语言播报,来解决iOS12.1系统以上在后台或者被杀死无法语音播报的问题 ?...2、Service Extension的Bundle Identifier需要在Main Target的命名空间下,比如说Main Target的BundleID为io.re.xxx,那么Service...Extension的BundleID应该类似与io.re.xxx.yyy这样的格式。

    1.5K31

    Android后台杀死系列之二:ActivityManagerService与App现场恢复机制

    AMS与后台杀死 本篇是Android后台杀死系列的第二篇,主要讲解ActivityMangerService是如何恢复被后台杀死的进程的(基于4.3 ),在开篇 FragmentActivity及PhoneWindow...,但是对于被后台杀死的进程如何恢复的并没有讲解,本篇不涉及后台杀死,比如LowmemoryKiller机制,只讲述被杀死的进程如何恢复的。...被后台杀死了呢?...“不保留活动”,这个时候,虽然会杀死Activity,但是仍然保留了ActivitRecord,所以再唤醒,或者回退的的时候仍然有迹可循,看一下ActivityStack的Destroy回调代码,...Application没有被后台杀死,Activity被杀死的恢复 打开开发者模式”不保留活动“,就是这种场景,在上面的分析中,知道,AMS主动异常杀死Activity的时候,将AcitivityRecord

    3.5K40
    领券