Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)

简介: Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)

前言:

本篇是在上一篇的基础上,进行的修改,没有看上一篇请先移步上一篇文章

Android JetPack组件之DataBinding的使用详解

想要在程序被系统杀死后,数据依然还在有两种方法。

第一种方法就是比较旧的一种方法,重写onSaveInstanceState方法,来存放我们想要保存的界面数据。

直接看修改后的DataBindingActivity中的代码

public class DataBindingActivity extends AppCompatActivity {
    private ViewModelWithDataBinding viewModelWithDataBinding;
    //当我们将layout文件转换为DataBinding的形式,Android studio会帮我们创建这样一个类
    //这个类的名称就是layout文件的名字 加上Binding
    private ActivityDataBindingBinding binding;
    public static final String KEY = "data_key";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //创建这个对象后,layout文件里面的标签,就会成为ActivityDataBindingBinding这个类的成员,可以直接访问
        binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        viewModelWithLiveData = new ViewModelProvider(this).get(ViewModelWithLiveData.class);
        if (savedInstanceState != null) {
            viewModelWithDataBinding.getNumber().setValue(savedInstanceState.getInt(KEY));
        }
        binding.setData(viewModelWithDataBinding);
        binding.setLifecycleOwner(this);
    }
    @Override
    public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outState.putInt(KEY, viewModelWithDataBinding.getNumber().getValue());
    }
}

第二种方法使用ViewModel本身自带的属性来解决这个问题

1、首先引入依赖

implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0"

2、之后将ViewModelWithDataBinding类中代码进行修改

public class ViewModelWithDataBinding extends ViewModel {
    private SavedStateHandle handle;
    //新增的一个构造函数
    public ViewModelWithDataBinding(SavedStateHandle handle) {
        this.handle = handle;
    }
    public MutableLiveData<Integer> getNumber() {
        if (!handle.contains(DataBindingActivity.KEY)) {
            handle.set(DataBindingActivity.KEY, 0);
        }
        return handle.getLiveData(DataBindingActivity.KEY);
    }
    public void add() {
        getNumber().setValue(getNumber().getValue() + 1);
    }
}

3、之后就是DataBindingActivity类中的修改

public class DataBindingActivity extends AppCompatActivity {
    private ViewModelWithDataBinding viewModelWithDataBinding;
    //当我们将layout文件转换为DataBinding的形式,Android studio会帮我们创建这样一个类
    //这个类的名称就是layout文件的名字 加上Binding
    private ActivityDataBindingBinding binding;
    public static final String KEY = "data_key";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //创建这个对象后,layout文件里面的标签,就会成为ActivityDataBindingBinding这个类的成员,可以直接访问
        binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
        viewModelWithDataBinding = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(ViewModelWithDataBinding.class);
        binding.setData(viewModelWithDataBinding);
        binding.setLifecycleOwner(this);
    }
}

这样就可以实现前面所述的功能,数据不会丢失~


目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1759 4
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
818 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
836 11
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
1800 4
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
618 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
3284 2
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1207 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。