You need to enable JavaScript to run this app. Android Java开发:如何实现退出后恢复用户最后浏览的ImageView练习进度
优惠活动
大模型
产品
解决方案
定价
更多

Android Java开发:如何实现退出后恢复用户最后浏览的ImageView练习进度

适配现有代码的SharedPreferences持久化方案

核心思路:不需要存储图片本身,因为练习图是固定存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 18:15:08