如何实现Android应用每次启动时自动记录启动时间到文件?
嘿,这个需求其实挺实用的,我来给你梳理下具体的实现思路和代码示例,应该能直接上手~
核心思路
要实现「每次启动应用自动保存启动时间到文件」,关键要抓两个点:
- 准确捕捉应用启动的时机:不管是冷启动(进程被杀死后重新打开)还是热启动(从后台唤醒到前台),都要触发保存操作;
- 安全简单的存储方式:用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>
额外说明
- 为什么不用SharedPreferences?
你提到考虑过SharedPreferences,但它更适合存储键值对数据。而我们需要记录每次启动的历史时间,是追加式的日志,用文件存储更方便,不需要额外序列化列表数据。 - 文件存储位置
用openFileOutput创建的文件存在APP的内部存储目录,路径大概是/data/data/你的包名/files/launch_records.txt,你可以通过Android Studio的Device File Explorer查看。 - Android版本兼容
如果用LocalDateTime,Android 8.0以下版本需要开启Desugar支持(在build.gradle里配置),或者直接用Calendar的写法更省心。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

