You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取任意应用上次启动至今的时长(新鲜度值)?

获取应用新鲜度(距离上次启动时长)的可靠实现方案

嘿,我来帮你搞定这个需求!你想要计算应用距离上次启动的时长,其实不用绕弯子去格式化日期再分割字符串——直接用时间戳计算才是最靠谱、最高效的方式,我给你整理一套完整的实现步骤:

核心思路

我们需要先把应用上次启动的时间戳存在本地存储(比如SharedPreferences)里,之后在BroadcastReceiver里拿当前时间戳和它做差值,再转换成易读的时长格式就好啦。

步骤1:记录应用上次启动的时间

在你的Application类的onCreate方法里,或者应用启动的第一个Activity的onCreate里,加入这段代码来记录启动时间:

// 初始化SharedPreferences,存储启动时间
SharedPreferences launchPrefs = getSharedPreferences("AppLaunchRecords", Context.MODE_PRIVATE);
long lastLaunchTimestamp = launchPrefs.getLong("last_launch_time", 0);

// 如果是第一次启动,就把当前时间存进去
if (lastLaunchTimestamp == 0) {
    launchPrefs.edit().putLong("last_launch_time", System.currentTimeMillis()).apply();
}

如果你的广播是监听应用再次启动的事件,记得在启动时更新这个时间戳哦。

步骤2:在BroadcastReceiver中计算时长

把你原来的代码替换成下面的实现,直接用时间戳差值计算,避免字符串处理的坑:

@Override
public void onReceive(Context context, Intent intent) {
    // 从SharedPreferences取出上次启动的时间戳
    SharedPreferences launchPrefs = context.getSharedPreferences("AppLaunchRecords", Context.MODE_PRIVATE);
    long lastLaunchTime = launchPrefs.getLong("last_launch_time", System.currentTimeMillis());
    long currentTime = System.currentTimeMillis();

    // 计算时间差(单位:毫秒)
    long timeDifference = currentTime - lastLaunchTime;

    // 把毫秒转换成天、小时、分钟的格式
    long days = timeDifference / (1000 * 60 * 60 * 24);
    long hours = (timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
    long minutes = (timeDifference % (1000 * 60 * 60)) / (1000 * 60);

    // 组装成易读的新鲜度描述
    String freshnessInfo = String.format("距离上次启动已过去:%d天 %d小时 %d分钟", days, hours, minutes);
    Log.d("AppFreshness", freshnessInfo);

    // 如果你是因为应用再次启动触发的广播,记得更新存储的启动时间
    // launchPrefs.edit().putLong("last_launch_time", currentTime).apply();
}

为什么不推荐你原来的字符串分割方式?

你之前用SimpleDateFormat格式化日期再拆分字符串的做法,存在几个问题:

  • 容易因为时区差异、系统日期格式变化导致分割出错
  • 字符串处理比时间戳计算更耗时,效率更低
  • 后续要转换成时长还要做额外的日期解析,步骤繁琐

额外注意事项

  • 确保SharedPreferences的名称(AppLaunchRecords)和键名(last_launch_time)在所有地方保持一致,不然会拿不到数据
  • 如果你的广播是监听系统开机完成(ACTION_BOOT_COMPLETED),记得在Manifest里声明对应的权限和广播接收器
  • 如果需要更精确的秒级计算,可以继续拆分timeDifference得到秒数

内容的提问来源于stack exchange,提问作者Nappa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:30:10