如何在Kotlin中检测应用是否为全新启动(非后台恢复)
实现全新启动检测的方案
核心思路
利用缓存目录存储标记文件(清除缓存操作会删除缓存目录下所有内容),结合Application的生命周期判断进程是否为全新创建,以此区分「后台恢复」和「清除缓存后的全新启动」。
具体实现步骤
1. 基于Application生命周期判断进程启动类型
应用进程被彻底销毁后重新启动时,Application.onCreate()会被调用;而从后台恢复时,该方法不会执行。以此为基础,结合缓存标记判断是否为清除缓存后的全新启动。
2. 用缓存目录存储启动标记
在缓存目录下创建一个标记文件,每次进程启动时检查该标记:
- 标记不存在:说明是清除缓存后的全新启动,执行对应逻辑后创建标记。
- 标记存在:说明是普通进程重启(未清除缓存)。
代码示例
public class MyApplication extends Application { private static final String BOOT_MARK_FILE = "app_boot_mark"; @Override public void onCreate() { super.onCreate(); checkFreshLaunch(); } private void checkFreshLaunch() { File cacheDir = getCacheDir(); File markFile = new File(cacheDir, BOOT_MARK_FILE); if (!markFile.exists()) { // 清除缓存后的全新启动逻辑 handleFreshLaunch(); // 创建标记文件 try { markFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } else { // 普通进程重启逻辑 handleNormalLaunch(); } } private void handleFreshLaunch() { Log.d("LaunchCheck", "全新启动(清除缓存后)"); // 这里写你的全新启动处理逻辑,比如初始化数据、展示引导页等 } private void handleNormalLaunch() { Log.d("LaunchCheck", "普通启动(未清除缓存)"); // 普通启动的处理逻辑 } }
3. 精准区分「后台恢复」与「进程重启」
如果需要进一步区分这两种场景,可以在Activity的onCreate()中通过Intent标记判断:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // 从后台恢复启动 Log.d("LaunchCheck", "从后台恢复"); return; } // 进程重启后的启动 Log.d("LaunchCheck", "进程重启启动"); }
方案优势
- 缓存目录的标记文件会随「清除缓存」操作被删除,完美匹配场景需求。
- 摆脱SharedPreferences仅能检测首次安装启动的局限性。
- 实现简单,仅需文件操作和生命周期判断,性能开销极低。
注意事项
- 部分定制ROM对「清除缓存」的范围有差异,需测试确认缓存目录是否会被清空。
- 多进程场景下需注意标记文件的读写同步,避免并发问题。
内容的提问来源于stack exchange,提问作者sejn
相关产品推荐
相关产品推荐

