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 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();
}
}