Android开发:如何保存当前壁纸分类以在Gif活动结束后返回
解决Gif动画Activity结束后返回对应壁纸分类页面的问题
要搞定这个返回分类页面的问题,核心就是把用户当前所在的分类信息妥善保存好,确保返回时能精准恢复,还要考虑到Activity被系统回收的极端情况,下面一步步来实现:
1. 给WallpapersActivity加个「状态备份」(应对系统回收)
有时候后台的WallpapersActivity会因为内存不足被系统干掉,这时候再返回就需要重新恢复分类信息。我们可以通过onSaveInstanceState来备份当前分类:
首先在WallpapersActivity里定义全局变量存当前分类:
private String currentCategory;
然后在onCreate方法里,优先从备份的状态里恢复分类,没有的话再从Intent里拿:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wallpapers); // 恢复或获取当前分类 if (savedInstanceState != null) { currentCategory = savedInstanceState.getString("KEY_CURRENT_CATEGORY"); } else { Intent intent = getIntent(); currentCategory = intent.getStringExtra("category"); } // 后续的toolbar标题、数据库引用初始化等,都用这个currentCategory变量 Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle(currentCategory); setSupportActionBar(toolbar); // ... 其他原有代码(比如dbWallpapers的初始化,把原来的category替换成currentCategory) }
接着重写onSaveInstanceState,把当前分类备份到Bundle里:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("KEY_CURRENT_CATEGORY", currentCategory); }
2. 启动Gif Activity时带上分类信息
在WallpapersActivity里启动Gif展示页面的时候,把当前分类通过Intent传过去,这样Gif页面就知道要返回哪个分类了:
// 示例:假设是在壁纸点击事件里启动Gif Activity Intent gifIntent = new Intent(WallpapersActivity.this, GifDisplayActivity.class); gifIntent.putExtra("KEY_TARGET_CATEGORY", currentCategory); // 把当前分类传过去 startActivity(gifIntent);
3. Gif动画结束后精准返回
当Gif的3秒动画结束后,直接调用finish()就能回到栈里原来的WallpapersActivity(因为启动Gif页面时没有清除任务栈,WallpapersActivity还在栈里躺着呢):
// 在Gif Activity的动画结束回调里执行 private void onGifAnimationDone() { // 直接结束当前Activity,自动回到之前的WallpapersActivity finish(); }
要是担心WallpapersActivity已经被系统回收了,也可以在Gif页面里主动启动WallpapersActivity并传分类,同时设置栈标记避免重复创建实例:
private void onGifAnimationDone() { String targetCategory = getIntent().getStringExtra("KEY_TARGET_CATEGORY"); Intent backIntent = new Intent(this, WallpapersActivity.class); backIntent.putExtra("category", targetCategory); // 清除WallpapersActivity之上的所有页面,复用已存在的实例 backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(backIntent); finish(); }
额外小提醒
- 别给WallpapersActivity设置
singleTask或singleInstance的启动模式,不然会打乱任务栈结构,导致返回逻辑出问题。 - 你当前代码里toolbar的返回按钮是跳转到HomeActivity,这个逻辑没问题(用户点击toolbar返回键回到首页),不会影响Gif页面返回WallpapersActivity的流程。
内容的提问来源于stack exchange,提问作者Lincoln Moreira
相关产品推荐
相关产品推荐

