首页 > 解决方案 > 在android java中发生异常后如何记录用户活动一段时间?

问题描述

我正在尝试记录异常以及用户导航 x 时间。例如,当我的应用程序出现异常时,我会将其附加到文本文件中。现在从那个时间点开始,我只需要记录一段时间。例如,1 小时。有可能做到吗?这是我为获取异常信息并将其记录在文件中而编写的代码。请有人帮我解决这个问题。提前致谢。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Thread.setDefaultUncaughtExceptionHandler(handleAppCrash);
 
    }


    private Thread.UncaughtExceptionHandler handleAppCrash =
                new Thread.UncaughtExceptionHandler() {
                    @SuppressLint("LongLogTag")
                    @Override
                    public void uncaughtException(Thread thread, Throwable ex) {
                        if (!file.exists()) {
                            file.mkdir();
                        }
                        try {
                            data = android_version + "@" + Device + "@" + username + "@" + version + "@" + dates + "@" + Logtrace;
    
                            File gpxfile = new File(file, fname);
                            FileWriter writer = new FileWriter(gpxfile,true);
                            writer.append(data);
                            writer.flush();
                            writer.close();
                        } catch (
                                Exception e) {
                            e.printStackTrace();
                        }
         }
     };

标签: android

解决方案


你正在寻找一种方法

  • 重启应用
  • 将更多日志写入您在UncaughtExceptionHandler.

首先,要重新启动应用程序,您可以执行以下步骤:

  1. 创建了一个待处理的意图,例如,在您的 onCreate 中(其中Intent intent有类范围,已经定义,即,不只是在 onCreate 中定义):

    intent = PendingIntent.getActivity(
        YourApplication.getInstance().getBaseContext(),
        0,
        new Intent(getIntent()),
        getIntent().getFlags());
    
  2. 在你的 try/catch 之后UncaughtExceptionHandler,启动警报以在一段时间内触发你的应用程序,例如 1 秒;并且您必须使用System.exit();. 这样当前正在死去的应用程序将正确退出,以便在 1 秒内,当警报触发时,它将再次启动应用程序(但如果应用程序仍在运行,则不会)。

    AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, intent);
    System.exit(2);
    
  3. 您可以选择将文件的名称(fname在您的代码中)存储到 SharedPreferences(用于在应用程序重新启动时写入同一文件)。或者它可能是您的应用程序知道的固定硬编码名称,并且不需要保存该名称。

  4. 您可以在 SharedPreferences 中保存一个布尔值,让您的应用知道您正在从未捕获的异常重新启动。

其次,每当应用程序启动时:

  1. 检查 SharedPreferences 中的布尔值;如果是正常开始,则照常进行。

  2. 如果是在未捕获异常后重新启动,则从 SharedPreferences 检索文件名(或对其进行硬编码),然后您可以将更多日志写入文件。与在 Android 中一样,文件由路径和文件名唯一确定。使用相同的文件名,您可以打开相同的文件。


推荐阅读