Android实现关机后数据不会丢失问题
作者:毛少雄 时间:2021-06-08 18:54:47
要实现关机后数据也不会丢失,需要使用到 AndroidViewModel,SaveStateHandle 和 SharePreferences 要达到的目的就是将数据保存成这个亚子
就不会出现app在异常闪退或者关机后数据的丢失了注意在使用SaveStateHandle和binding的时候需要在gradle里面设置一波
数据类
package com.example.applicationtest04;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
public class MyVIewModel extends AndroidViewModel {
SavedStateHandle handle; //声明savedstatehandle 类型
String shpName = getApplication().getResources().getString(R.string.shp_name);
String key = getApplication().getResources().getString(R.string.key);
public MyVIewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
this.handle = handle;
if(!handle.contains(key)){
load();
}
}
public LiveData<Integer> getNumber(){
return handle.getLiveData(key);
}
public void load(){
SharedPreferences shp = getApplication().getSharedPreferences(shpName, Context.MODE_PRIVATE);
int x = shp.getInt(key,0);
handle.set(key,x);
}
public void save(){
SharedPreferences shp = getApplication().getSharedPreferences(shpName,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt(key,getNumber().getValue());
editor.apply();
}
public void add(int x){
handle.set(key,getNumber().getValue()+x);
}
}
//这段代码里面有几个重要的点就是在使用handle的时候要注意使用的数据是liveData
Mainactive类
package com.example.applicationtest04;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateVMFactory;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import com.example.applicationtest04.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
MyVIewModel myVIewModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
this.myVIewModel = ViewModelProviders.of(this,new SavedStateVMFactory(this)).get(MyVIewModel.class);
binding.setData(myVIewModel);
binding.setLifecycleOwner(this);
}
@Override
protected void onPause() {
super.onPause();
myVIewModel.save();
}
}
//这段代码的重点就是使用onPause这个声明周期的函数来调用save()函数
布局xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="Data"
type="com.example.applicationtest04.MyVIewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(Data.getNumber())}"
android:textColor="@color/colorPrimaryDark"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.324" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="@string/buttonPlus"
android:onClick="@{()->Data.add(1)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.182"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.499" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="@string/buttonSub"
android:onClick="@{()->Data.add(-1)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.804"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.499" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
测试效果先加到12
再重启
重启之后重新打开app
值还是没有变化测试成功
总结
以上所述是小编给大家介绍的Android实现关机后数据不会丢失问题,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/weixin_43635647/article/details/102766005
标签:android,关机,数据,不会丢失
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
MyBatis Xml映射文件之字符串替换方式
2022-03-23 00:06:39
c#使用windows服务更新站点地图的详细示例
2021-07-24 10:45:52
![](https://img.aspxhome.com/file/2023/2/80102_0s.png)
C#文件合并的方法
2022-08-07 13:22:17
java数字转汉字工具类详解
2023-04-28 02:00:26
Java使用arthas修改日志级别详解
2023-02-04 23:09:26
![](https://img.aspxhome.com/file/2023/8/85398_0s.png)
Android Studio使用小技巧:提取方法代码片段
2023-11-14 19:35:20
![](https://img.aspxhome.com/file/2023/9/87299_0s.gif)
Java中使用Lambda表达式和函数编程示例
2022-05-06 03:30:40
浅谈Spring @Async异步线程池用法总结
2021-09-11 07:12:08
使用Java visualVM监控远程JVM的流程分析
2022-03-19 16:56:02
![](https://img.aspxhome.com/file/2023/2/73062_0s.png)
C# 多线程读取注册表,加载至TreeView
2023-04-08 14:52:27
Windows系统中使用C#编写蓝牙通信程序的简单实例
2022-03-02 00:12:10
![](https://img.aspxhome.com/file/2023/4/96344_0s.jpg)
Java基于Tcp协议的socket编程实例
2022-03-08 00:04:13
mybatis的if判断integer问题
2022-12-23 20:15:41
Java中输出字符的ASCII值实例
2023-02-27 08:59:11
![](https://img.aspxhome.com/file/2023/4/83444_0s.jpg)
SpringBoot使用POI进行Excel下载
2022-06-14 13:16:13
解析JAVA深度克隆与浅度克隆的区别详解
2023-11-02 10:57:28
SpringBoot绿叶显示yml和端口问题及解决方法
2023-12-09 00:29:13
![](https://img.aspxhome.com/file/2023/5/62775_0s.png)
梳理总结Java static关键字的方法作用
2023-06-09 04:06:17
![](https://img.aspxhome.com/file/2023/3/66033_0s.png)
Spring Bean的初始化和销毁实例详解
2023-10-28 05:56:04
Unity 使用tiledmap解析地图的详细过程
2023-06-02 18:40:57
![](https://img.aspxhome.com/file/2023/4/96314_0s.jpg)