Android Java开发:如何实现退出后恢复用户最后浏览的ImageView练习进度
核心思路:不需要存储图片本身,因为练习图是固定存在mImageIds数组中的,只需要把当前浏览对应的image_index整数数值持久化保存,下次打开应用时读取这个数值给image_index赋值,就能完全还原上次停留的位置,和你已有的前后切换逻辑完全兼容,不需要重构原有功能。
具体改动逻辑
- 提前定义固定的SharedPreferences文件名和存储键名,避免硬编码导致读写不匹配
- 应用启动时,在展示初始图片之前,从本地存储读取上次保存的索引值,初始化
image_index - 封装独立的索引保存方法,只要用户点击上一个/下一个按钮切换了图片,就立刻把最新的索引值写入本地存储,保证任意退出场景下的状态不丢失
适配后的完整Activity代码
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private int image_index = 0; private static final int MAX_IMAGE_COUNT = 3; // 新增:定义SharedPreferences的固定常量 private static final String PREFS_STORAGE_NAME = "sight_reading_prefs"; private static final String KEY_SAVED_IMAGE_INDEX = "last_browsed_image"; private int[] mImageIds = { R.raw.image1, R.raw.image2, R.raw.image3 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 启动时读取上次保存的索引 SharedPreferences prefs = getSharedPreferences(PREFS_STORAGE_NAME, MODE_PRIVATE); // 读取默认值为0,即第一次打开无历史记录时从第一张图开始 image_index = prefs.getInt(KEY_SAVED_IMAGE_INDEX, 0); showImage(); } private void showImage() { ImageView imgView = findViewById(R.id.myimage); imgView.setImageResource(mImageIds[image_index]); // 图片展示完成后立刻保存当前索引 saveCurrentIndex(); } // 独立的索引保存方法 private void saveCurrentIndex() { SharedPreferences prefs = getSharedPreferences(PREFS_STORAGE_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putInt(KEY_SAVED_IMAGE_INDEX, image_index); // 异步写入数据,不会阻塞UI线程 editor.apply(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.previous_btn: image_index--; if (image_index == -1) { image_index = MAX_IMAGE_COUNT - 1; } showImage(); break; case R.id.next_btn: image_index++; if (image_index == MAX_IMAGE_COUNT) { image_index = 0; } showImage(); break; } } }
实现说明
- 这套逻辑覆盖所有退出场景:不管用户按返回键退出、从后台划掉应用、系统低内存杀掉进程,只要没有手动清除应用存储,下次打开都会直接回到上次浏览的练习位置
- 你原有代码的循环切换逻辑完全没有改动,后续如果要新增更多练习图片,只需要往
mImageIds数组里追加图片资源ID即可,存储逻辑不需要做任何修改 - 写入操作使用
apply()而非commit(),属于异步操作,不会因为磁盘IO导致界面卡顿,适合存储这种小体量的状态数据
其他替代思路:如果后续练习数量变多、需要记录更多用户偏好(比如练习进度、自定义设置),可以用Room数据库做持久化,但对当前3个练习的场景来说,SharedPreferences是复杂度最低、最适配现有代码的方案,没有额外学习成本。
内容的提问来源于stack exchange,提问作者johnnytheripper
相关产品推荐
相关产品推荐

