如何知道 android 应用程序上次是否崩溃

How to know if android application was crashed last time

我有一个 android 应用程序,我想知道在这个应用程序启动时我的应用程序之前是否崩溃过。此崩溃可能是 OS 出于节省内存或任何其他原因在应用程序上强制执行的崩溃。它可能不会被 UnhandledExceptionHandler 捕获。到目前为止我处理的内容如下所示,它没有缓存 those 原生 os 相关和内存强制案例

UncaughtExceptionHandler handler = new UncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);

编辑:

请不要推荐第 3 方库。

这将通过 SharedPreferences 实现,首先,当您在 MainActivity 中输入您的应用程序时,创建一个名为 crashboolean 变量并将其保存到您的 SharedPreferences 的值为 false,然后在发生崩溃时,只需使用值 true 重新保存此变量,这将自动覆盖之前存储的 crash 值。

保存值:

private void savePreferences(String key, String value) {
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    Editor editor = sharedPreferences.edit();
    editor.putBoolean("crash", false);
    editor.commit();
}

加载保存的值:

private void loadSavedPreferences() {
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    boolean crash = sharedPreferences.getBoolean("crash", false);
    if(crash){
        // then your app crashed the last time
    }else{
        // then your app worked perfectly the last time
    }
}

因此,在您的崩溃处理程序中 class,只需将值保存为 true:

p.s。对于来自 OS.

的所有未处理异常,这必须 运行
public class CrashHandler extends Application{

    public static Context context;

    public void onCreate(){
        super.onCreate();

        CrashHandler.context = getApplicationContext();
        // Setup handler for uncaught exceptions.
        Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
        {
          @Override
          public void uncaughtException (Thread thread, Throwable e)
          {
            handleUncaughtException (thread, e);
          }
        });

    }

    public void handleUncaughtException (Thread thread, Throwable e)
    {
      e.printStackTrace(); // not all Android versions will print the stack trace automatically

      SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(context);
        Editor editor = sharedPreferences.edit();
        editor.putBoolean("crash", true);
        editor.commit();

    }

}

1) 当 Android 杀死并重新启动您的应用程序时,静态变量将设置为 null(更准确地说,最初设置为 null,稍后,很快,设置为它们的初始值;静态初始化程序可能会在尚未初始化的变量中看到 null)。因此,如果某个静态变量设置为 null,而 Bundle 中的数据表明用户一直在做某事,则会重新启动进程(我假设您知道 Bundle 在 onCreate(捆绑包)).

2) 你可能在持久存储中有一个标志;例如,该标志将在应用程序启动时设置为 true,并在正常完成之前设置为 false。如果应用程序启动时该标志为真,则发生崩溃。 (应用程序正常关闭后崩溃的可能性仍然很小......但这对你来说很重要吗?)

3) 您可以将应用程序的 pid 保存在持久内存中(参见 myPid())。

我找到了一个 hack,它对我有用。如果知道用户是否离开了应用程序或关闭了系统或做了任何此类事情或应用程序本身被关闭,则可以检查其应用程序是否崩溃。如果应用程序本身被关闭,则意味着它崩溃了,否则它不是(在用户关闭应用程序或关闭系统等情况下)。

在共享首选项的帮助下,可以存储和获取一个变量,该变量将判断应用程序是否崩溃,代码如下所示

public class Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    boolean appcrashed=false;
    super.onCreate(savedInstanceState);
    boolean didUserLeft=loadSavedPreferences();
    appcrashed=!didUserLeft;
    if(appcrashed)
        Toast.makeText(this, "App Crashed!", Toast.LENGTH_LONG).show();
    else
        Toast.makeText(this, "App OK!", Toast.LENGTH_LONG).show();
    savePreferences(false);

    UnhandledExceptionHandler handler = new UnhandledExceptionHandler();

    Thread.setDefaultUncaughtExceptionHandler(handler);

}


public boolean loadSavedPreferences() {
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    boolean didUserLeft = sharedPreferences.getBoolean("didUserLeft", true);
    return didUserLeft;
}

public void savePreferences(boolean value) {
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    Editor editor = sharedPreferences.edit();
    editor.putBoolean("didUserLeft", value);
    editor.commit();
}

@Override
public void onResume(){
    super.onResume();
    savePreferences(false);
}

@Override
public void onDestroy(){
    savePreferences(true);
}

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first
    savePreferences(true);
    }


@Override
public void onUserLeaveHint(){
    savePreferences(true);
}