首页 > 系统 > Android > 正文

Android实现关机后数据不会丢失问题

2019-12-12 00:03:51
字体:
来源:转载
供稿:网友

要实现关机后数据也不会丢失,需要使用到 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实现关机后数据不会丢失问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表