Android内存变量清空时,指定模块重启至Activity A的实现方案
Android特定模块缓存失效后重启至入口页方案
核心思路
针对指定模块的页面(A->B->C->D),通过基类统一校验缓存有效性,当静态缓存因内存回收失效时,自动清理当前模块的任务栈并重启至Activity A,且仅作用于该模块内的页面。
具体实现步骤
1. 定义模块专属基类
创建该模块所有Activity的基类,统一处理缓存校验与重启逻辑,避免重复代码:
public abstract class TargetModuleBaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 校验缓存有效性,若失效且当前不是入口页A,则重启至A if (!AppCache.isCacheValid() && !(this instanceof ActivityA)) { restartToActivityA(); finish(); return; } } private void restartToActivityA() { Intent intent = new Intent(this, ActivityA.class); // 清除Activity A之上的同栈页面,确保栈中仅保留A intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // 携带重启标识,方便A页面做针对性处理 intent.putExtra("RESTART_TRIGGER", "CACHE_RECYCLED"); startActivity(intent); } }
2. 统一缓存校验逻辑
封装静态缓存的有效性判断,集中管理避免分散判断:
public class AppCache { // 模块内使用的静态缓存变量 public static ModuleCacheData staticCache; // 统一校验缓存是否有效 public static boolean isCacheValid() { // 根据实际缓存内容调整判断逻辑,比如检查核心字段是否为空 return staticCache != null && staticCache.getCoreData() != null; } }
3. 模块页面继承基类
让模块内的B、C、D页面继承上述基类,自动拥有缓存校验能力:
public class ActivityD extends TargetModuleBaseActivity { // 业务代码正常编写,无需额外处理缓存校验 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_d); // 原本使用缓存的逻辑不变,缓存失效时已被基类拦截重启 } }
4. 配置入口页Activity A
在Manifest中给Activity A设置singleTask启动模式,确保重启时不会创建新实例,且清理栈顶页面:
<activity android:name=".ActivityA" android:launchMode="singleTask"> <!-- 其他配置如intent-filter等 --> </activity>
5. 处理Activity A的重启场景
在Activity A中根据重启标识,重新初始化缓存与页面状态:
public class ActivityA extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCacheAndPage(); handleRestartTrigger(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleRestartTrigger(intent); } private void initCacheAndPage() { // 从数据源加载数据并初始化静态缓存 AppCache.staticCache = loadModuleData(); // 初始化页面UI等操作 } private void handleRestartTrigger(Intent intent) { if ("CACHE_RECYCLED".equals(intent.getStringExtra("RESTART_TRIGGER"))) { // 缓存失效重启时的特殊处理,比如重置筛选条件、刷新页面 refreshPageForRestart(); } } }
边界控制说明
- 仅继承
TargetModuleBaseActivity的页面会触发该逻辑,其他模块页面不受影响; - 缓存校验逻辑集中在
AppCache中,可根据业务灵活调整判断规则; - 通过
FLAG_ACTIVITY_CLEAR_TOP确保仅清理当前模块的任务栈,不会影响应用内其他模块的页面栈。
内容的提问来源于stack exchange,提问作者Ujjwal Kumar Maharana
相关产品推荐
相关产品推荐

