SharedPreferences+LiveData結合的方式,會比較好,重啟數據會保存操作記錄!
LiveData:能夠自動監聽更新界面上的控件!
SharedPreferences:數據永久化保存,保存在硬件上(只能保存簡單的數據:如字符串、布爾值、數值型等等)
AndroidViewModel:可以直接在這個類里面訪問context或getApplication()
SavedStateHandle:存儲的生命周期比較長,但是如果重啟系統或應用被殺死,數據會丟失。
ViewModel中通過SharedPreferences保存到硬件上的數據,會比較耗性能
可以放在Activity后台中onpause()事件中
==========================================
AndroidViewModel是ViewModel的一個子類,可以直接調用getApplication(),由此可以訪問應用的全局資源。
在 MyViewModel 這個類中,此類直接繼承自 AndroidViewModel ,平時一般這個類是繼承 ViewModel
public class MyViewModel extends AndroidViewModel {
然后在 MyViewModel 這個類中,可以直接用 getApplication()這個方法,訪問全局資源文件了
getApplication().getResources().getString(R.string.shp_name);
通過 SavedStateHandle 與 LiveData 配合 自動更新控件數據
通過 SharedPreferences 對數據進行 持久化 存儲!關機后再開機,之前數據狀態還會顯示
1. MyViewModel 類
package com.example.androidviewmodeltest; 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.SavedStateHandle; public class MyViewModel extends AndroidViewModel { //方法1. 本類繼承自 ViewModel public class MyViewModel extends ViewModel //通過 context 外部類,就可以直接對 SharedPreferences 進行訪問 /*Context context; void test(){ //通過 context 外部類,就可以直接對 SharedPreferences 進行訪問 context.getSharedPreferences("",Context.MODE_PRIVATE); }*/ //Application application; SavedStateHandle handle;//需要在 build.gradle中引用 implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01' //這個類繼承自AndroidViewModel 就可以直接訪問: getApplication().getResources().getString(R.string.buttonJia);//這樣就可以直接訪問全局資源文件了 String key = getApplication().getResources().getString(R.string.dataKey); String shpName = getApplication().getResources().getString(R.string.shp_name); //方法2. 繼續自 AndroidViewModel public class MyViewModel extends AndroidViewModel public MyViewModel(@NonNull Application application, SavedStateHandle handle) { super(application); //getApplication().getResources().getString(R.string.buttonJia);//這樣就可以直接訪問全局資源文件了 this.handle = handle; if(!handle.contains(key)) load(); } //public 整個項目均方法可見 //private 只能在本類中方法可見 //protected 本類或子類可見 //沒有前綴,即不寫的話,在本包中的類都可見, 例如在 MainActivity中訪問load()這個方法 myViewModel.load(); public LiveData<Integer> getNumber(){ return handle.getLiveData(key); } void load(){ SharedPreferences shp = getApplication().getSharedPreferences(shpName,Context.MODE_PRIVATE); int x = shp.getInt(key,0); handle.set(key,x); } 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); //save();//如果裝飾save() 操作放這里,會頻繁保存數據,可能會影響性能 } }
2. MainActivity 類
package com.example.androidviewmodeltest; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.databinding.DataBindingUtil; import androidx.lifecycle.SavedStateVMFactory; import androidx.lifecycle.ViewModelProviders; import com.example.androidviewmodeltest.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { MyViewModel myViewModel; ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); // myViewModel.application = getApplication(); // myViewModel.context = getApplicationContext(); //context是比較頂層的類, binding = DataBindingUtil.setContentView(this,R.layout.activity_main); myViewModel = ViewModelProviders.of(this,new SavedStateVMFactory(this)).get(MyViewModel.class); binding.setData(myViewModel); binding.setLifecycleOwner(this); } //在 onPause 事件中操作保存,性能比較好,不頻繁操作保存記錄 //但是如果手機突然沒電或重啟,可能會導致此方法沒調用成功 @Override protected void onPause() { super.onPause(); myViewModel.save(); } }