2.13 ViewModel 使数据即使在后台被杀死数据也能存活

操作程序如下:

主要是创建一个

SavedStateHandle 来缓存上一次的数据,并通过重新读取上一次存储的数据来实现数据的存活

MyVIewModel:

 1 package com.example.viewmodeltest;
 2 
 3 import androidx.lifecycle.MutableLiveData;
 4 import androidx.lifecycle.SavedStateHandle;
 5 import androidx.lifecycle.ViewModel;
 6 
 7 public class MyViewModel extends ViewModel {
 8     private MutableLiveData<Integer> number;
 9 
10     private SavedStateHandle handle;
11     //存放简单数据
12    /* public MyViewModel(SavedStateHandle handle){
13             this.handle=handle;
14     }*/
15 
16     public MutableLiveData<Integer> getNumber() {
17         if(number ==null){
18             number =new MutableLiveData<>();
19             number.setValue(0);
20         }
21         return number;
22     /*  if (handle.contains(MainActivity.KEY_NUMBER)){
23           handle.set(MainActivity.KEY_NUMBER,0);   //第一次被加载时执行
24       }
25       return handle.getLiveData(MainActivity.KEY_NUMBER);*/
26     }
27     public  void  add(){
28         number.setValue(number.getValue()+1);
29        // getNumber().setValue(getNumber().getValue()+1);
30     }
31 }

Main_Activity 

 1 package com.example.viewmodeltest;
 2 
 3 import androidx.annotation.NonNull;
 4 import androidx.appcompat.app.AppCompatActivity;
 5 import androidx.databinding.DataBindingUtil;
 6 import androidx.lifecycle.SavedStateViewModelFactory;
 7 import androidx.lifecycle.ViewModelProvider;
 8 import androidx.lifecycle.ViewModelProviders;
 9 
10 import android.os.Bundle;
11 
12 import com.example.viewmodeltest.databinding.ActivityMainBinding;
13 
14 public class MainActivity extends AppCompatActivity {
15 
16     ActivityMainBinding binding;
17     MyViewModel myViewModel;
18     public final  static  String KEY_NUMBER ="my_number";  //类似全局变量 存储上一次的数据
19 
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
24         myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
25         //myViewModel= ViewModelProviders.of(this,new SavedStateViewModelFactory(this)).get(MyViewModel.class);
26       /*  if(savedInstanceState!=null){
27             myViewModel.getNumber().setValue(savedInstanceState.getInt(KEY_NUMBER));
28         }*/
29 
30         binding.setData(myViewModel);
31         binding.setLifecycleOwner(this);
32 
33     }
34 
35     @Override
36     protected void onSaveInstanceState(@NonNull Bundle outState) {  //调用存储数据的函数
37         super.onSaveInstanceState(outState);
38         outState.putInt(KEY_NUMBER,myViewModel.getNumber().getValue());
39     }
40 }

Android持久化存储的几种方式

1.文件存储 

在应用开发当中会出现从网络中加载图片的过程。而从网络请求都需要时间,若网络速度不够快,就会造成网络图片加载过慢,甚至不成功的问题。在Android中对此的处理就是对已加载的图片文件进行缓存,包括内存缓存和硬盘缓存。

2.网络存储

例如每个用户的个人资料,都会在远程服务器存储一份,保证在不同的终端都可以登陆或者获取每个用户的个人资料。

3.SharedPreferences

它是一种轻量级的存储方式,适用于存储简单的参数配置。比如说上一次登陆的账号等等。

SharedPreferences的原理是使用XMl文件来存放数据。

4.Sqlit数据库存储和ContentProvider

ContentProvider

属于Android的四大组件之一。主要作用为用来与其他应用进行数据交互。

ContentProvider只是用来提供内容或者修改内容的接口。

具体如何去获取数据、去哪里获取数据我们还是需要依靠其他的数据获取的方式。在ContentProvider内部,我们可以通过网络去得到当前应用的用户资料,可以通过SharedPreferences得到当前应用的配置,也可以通过文件来得到某些资源。所以它当然也可以通过Sqlit来操作底层的数据库。

参考 : https://blog.csdn.net/qq_35700731/article/details/78781540

原文地址:https://www.cnblogs.com/cxy0210/p/12304059.html