ViewModel
| implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' |
| <?xml version="1.0" encoding="utf-8"?> |
| <LinearLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".MainActivity"> |
| |
| <Button |
| android:id="@+id/btn1" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@string/btn1" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.501" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.327" /> |
| |
| <Button |
| android:id="@+id/btn2" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@string/btn2" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.501" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.499" /> |
| |
| <TextView |
| android:id="@+id/textView" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="TextView" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.498" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.151" /> |
| |
| <ImageButton |
| android:id="@+id/imageButton" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.154" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.4" |
| app:srcCompat="@android:drawable/btn_star_big_off" /> |
| |
| <ImageButton |
| android:id="@+id/imageButton2" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.853" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.4" |
| app:srcCompat="@android:drawable/btn_star_big_on" /> |
| |
| </LinearLayout> |
| package com.example.myviewmodel; |
| |
| import androidx.lifecycle.ViewModel; |
| |
| public class MyViewModel extends ViewModel { |
| public int count; |
| } |
| package com.example.myviewmodel; |
| |
| import androidx.appcompat.app.AppCompatActivity; |
| import androidx.lifecycle.ViewModelProviders; |
| |
| import android.os.Bundle; |
| import android.view.View; |
| import android.widget.Button; |
| import android.widget.TextView; |
| |
| public class MainActivity extends AppCompatActivity { |
| |
| private Button btn1, btn2; |
| private TextView tv; |
| |
| MyViewModel myViewModel; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_main); |
| |
| myViewModel = ViewModelProviders.of(this).get(MyViewModel.class); |
| |
| btn1 = findViewById(R.id.btn1); |
| btn2 = findViewById(R.id.btn2); |
| tv = findViewById(R.id.textView); |
| |
| btn1.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| myViewModel.count++; |
| tv.setText(String.valueOf(myViewModel.count)); |
| } |
| }); |
| |
| btn2.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| myViewModel.count += 2; |
| tv.setText(String.valueOf(myViewModel.count)); |
| } |
| }); |
| |
| } |
| } |
保存状态

使viewmodel存活到系统配置改变,后台进程被杀死。但系统重新启动后,viewmodel也会重新创建,数据就没了。
| implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' |
| implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0' |
| <?xml version="1.0" encoding="utf-8"?> |
| <layout xmlns:android="http://schemas.android.com/apk/res/android"> |
| |
| <data> |
| <variable |
| name="data" |
| type="com.example.myviewmodelrestore.MyViewModel" /> |
| </data> |
| |
| <LinearLayout |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| android:orientation="vertical"> |
| |
| <TextView |
| android:id="@+id/tv" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@{String.valueOf(data.getNumber)}"/> |
| |
| <Button |
| android:id="@+id/btn" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="Button" |
| android:onClick="@{()->data.add()}"/> |
| |
| </LinearLayout> |
| </layout> |
| package com.example.myviewmodelrestore; |
| |
| import androidx.lifecycle.MutableLiveData; |
| import androidx.lifecycle.SavedStateHandle; |
| import androidx.lifecycle.ViewModel; |
| |
| public class MyViewModel extends ViewModel { |
| private SavedStateHandle handle; |
| public MyViewModel(SavedStateHandle handle){ |
| if (!handle.contains(MainActivity.KEY_NUMBER)){ |
| handle.set(MainActivity.KEY_NUMBER, 0); |
| } |
| this.handle = handle; |
| } |
| |
| public MutableLiveData<Integer> getNumber() { |
| return handle.getLiveData(MainActivity.KEY_NUMBER); |
| } |
| |
| public void add(){ |
| handle.set(MainActivity.KEY_NUMBER, (int) handle.get(MainActivity.KEY_NUMBER) + 1); |
| } |
| } |
| package com.example.myviewmodelrestore; |
| |
| import androidx.annotation.Keep; |
| import androidx.annotation.NonNull; |
| import androidx.appcompat.app.AppCompatActivity; |
| import androidx.databinding.DataBindingUtil; |
| import androidx.lifecycle.SavedStateViewModelFactory; |
| import androidx.lifecycle.ViewModelProvider; |
| import androidx.lifecycle.ViewModelProviders; |
| |
| import android.os.Bundle; |
| |
| import com.example.myviewmodelrestore.databinding.ActivityMainBinding; |
| |
| public class MainActivity extends AppCompatActivity { |
| |
| MyViewModel myViewModel; |
| ActivityMainBinding binding; |
| final static String KEY_NUMBER = "my_number"; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| binding = DataBindingUtil.setContentView(this, R.layout.activity_main); |
| myViewModel = new ViewModelProvider(this).get(MyViewModel.class); |
| |
| binding.setData(myViewModel); |
| binding.setLifecycleOwner(this); |
| } |
| } |
ViewModel访问全局资源

| implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' |
| implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0' |
| <?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.myviewmodelsp.MyViewModel" /> |
| |
| </data> |
| |
| <androidx.constraintlayout.widget.ConstraintLayout |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".MainActivity"> |
| |
| <TextView |
| android:id="@+id/tv" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@{String.valueOf(data.getNumber())}" |
| android:textSize="48sp" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintLeft_toLeftOf="parent" |
| app:layout_constraintRight_toRightOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| tools:text="100" /> |
| |
| <Button |
| android:id="@+id/btn_add" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@string/btn_add" |
| android:onClick="@{()->data.add(1)}" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.264" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.582" /> |
| |
| <Button |
| android:id="@+id/btn_minus" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@string/btn_minus" |
| android:onClick="@{()->data.add(-1)}" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.735" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.582" /> |
| |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| </layout> |
| package com.example.myviewmodelsp; |
| |
| 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; |
| import androidx.lifecycle.ViewModel; |
| |
| public class MyViewModel extends AndroidViewModel { |
| |
| SavedStateHandle handle; |
| String key = getApplication().getResources().getString(R.string.data_key); |
| String spName = getApplication().getResources().getString(R.string.sp_name); |
| |
| 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); |
| } |
| |
| private void load(){ |
| |
| SharedPreferences sp = getApplication().getSharedPreferences(spName, Context.MODE_PRIVATE); |
| int x = sp.getInt(key, 0); |
| handle.set(key, x); |
| } |
| |
| public void save(){ |
| SharedPreferences sp = getApplication().getSharedPreferences(spName, Context.MODE_PRIVATE); |
| SharedPreferences.Editor editor = sp.edit(); |
| editor.putInt(key, getNumber().getValue()); |
| editor.apply(); |
| } |
| |
| public void add(int x){ |
| handle.set(key, getNumber().getValue() + x); |
| |
| } |
| } |
| package com.example.myviewmodelsp; |
| |
| import androidx.appcompat.app.AppCompatActivity; |
| import androidx.databinding.DataBindingUtil; |
| import androidx.lifecycle.SavedStateViewModelFactory; |
| import androidx.lifecycle.ViewModelProviders; |
| |
| import android.os.Bundle; |
| |
| import com.example.myviewmodelsp.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); |
| myViewModel = new ViewModelProvider(this).get(MyViewModel.class); |
| binding.setData(myViewModel); |
| binding.setLifecycleOwner(this); |
| } |
| |
| @Override |
| protected void onPause() { |
| super.onPause(); |
| myViewModel.save(); |
| } |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/15151895.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步