要实现关机后数据也不会丢失,需要使用到 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实现关机后数据不会丢失问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
以上是内存溢出为你收集整理的Android实现关机后数据不会丢失问题全部内容,希望文章能够帮你解决Android实现关机后数据不会丢失问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)