AndroidViewModel是ViewModel的一個子類,能夠直接調用getApplication(),由此能夠訪問應用的全局資源。java
在 MyViewModel 這個類中,此類直接繼承自 AndroidViewModel ,平時通常這個類是繼承 ViewModelandroid
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(); } }