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

如何实现Android应用每次启动时自动记录启动时间到文件?

嘿,这个需求其实挺实用的,我来给你梳理下具体的实现思路和代码示例,应该能直接上手~

核心思路

要实现「每次启动应用自动保存启动时间到文件」,关键要抓两个点:

  1. 准确捕捉应用启动的时机:不管是冷启动(进程被杀死后重新打开)还是热启动(从后台唤醒到前台),都要触发保存操作;
  2. 安全简单的存储方式:用APP内部存储来写文件,不需要申请权限,还能保证数据只有你的APP能访问。
具体代码实现

第一步:自定义Application类(全局监听应用状态)

Application的生命周期是整个APP的入口,我们可以在这里注册Activity生命周期回调,精准判断APP是否从后台进入前台(或者第一次启动)。

public class MyApplication extends Application {
    private boolean isAppForeground = false;

    @Override
    public void onCreate() {
        super.onCreate();
        // 注册Activity生命周期监听,用来判断APP前后台状态
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {}

            @Override
            public void onActivityStarted(@NonNull Activity activity) {
                // 只有当APP从后台进入前台时,才执行保存操作
                if (!isAppForeground) {
                    saveLaunchTimeToFile();
                    isAppForeground = true;
                }
            }

            @Override
            public void onActivityResumed(@NonNull Activity activity) {}

            @Override
            public void onActivityPaused(@NonNull Activity activity) {}

            @Override
            public void onActivityStopped(@NonNull Activity activity) {
                // 更新APP是否在后台的状态
                isAppForeground = !isAppInBackground();
            }

            @Override
            public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {}
        });
    }

    // 判断APP是否处于后台
    private boolean isAppInBackground() {
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> processInfos = activityManager.getRunningAppProcesses();
        if (processInfos != null) {
            for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
                if (processInfo.processName.equals(getPackageName())) {
                    return processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
                }
            }
        }
        return false;
    }

    // 核心方法:保存启动时间到文件
    private void saveLaunchTimeToFile() {
        // 1. 获取格式化后的当前时间
        String currentTime = getFormattedDateTime();
        // 2. 把时间追加写入文件(每次启动的时间单独一行)
        appendToFile(currentTime + "\n");
    }

    // 获取格式化的日期时间字符串(两种写法,选一种就行)
    private String getFormattedDateTime() {
        // 写法一:Android 8.0+ 推荐用LocalDateTime,更简洁
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return now.format(formatter);

        // 写法二:兼容Android 8.0以下版本,用Calendar
        /*
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return sdf.format(calendar.getTime());
        */
    }

    // 追加内容到内部存储的文件
    private void appendToFile(String content) {
        try {
            // openFileOutput是APP内部存储的方法,MODE_APPEND表示追加模式
            FileOutputStream fos = openFileOutput("launch_records.txt", MODE_APPEND);
            fos.write(content.getBytes());
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
            // 这里可以加异常处理,比如用Log记录错误,或者给用户提示
        }
    }
}

第二步:在Manifest中注册自定义Application

打开AndroidManifest.xml,在<application>标签里指定我们自定义的Application类:

<application
    android:name=".MyApplication" <!-- 关键:替换成你的自定义Application类路径 -->
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.YourAppName">
    
    <!-- 你的Activity声明 -->
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
额外说明
  1. 为什么不用SharedPreferences?
    你提到考虑过SharedPreferences,但它更适合存储键值对数据。而我们需要记录每次启动的历史时间,是追加式的日志,用文件存储更方便,不需要额外序列化列表数据。
  2. 文件存储位置
    用openFileOutput创建的文件存在APP的内部存储目录,路径大概是/data/data/你的包名/files/launch_records.txt,你可以通过Android Studio的Device File Explorer查看。
  3. Android版本兼容
    如果用LocalDateTime,Android 8.0以下版本需要开启Desugar支持(在build.gradle里配置),或者直接用Calendar的写法更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:53:06