Как узнать, было ли приложение android разбито в прошлый раз


У меня есть приложение для android, и я хочу знать при запуске этого приложения, разбилось ли мое приложение ранее или нет. Этот сбой может быть вызван сбоем ОС в приложении для экономии памяти или по любой другой причине. Он не может быть пойман в UnhandledExceptionHandler. То, что я обработал до сих пор, приведено ниже, и это не кэширование тех случаев, связанных с родной ОС и принудительной памятью

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

Правка:

Пожалуйста, не предлагайте сторонние библиотеки.

3 3

3 ответа:

Это произойдет через SharedPreferences, прежде всего, когда вы просто введете свое приложение в MainActivity создадите переменную boolean с именем crash и сохраните ее в свой 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
    }
}

Итак, в вашем классе обработчика сбоев просто сохраните значение к истине:

p. s. это должно выполняться для всех необработанных исключений, независимо от приложения из ОС.

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();

    }

}

Я нашел Хак, и он сработал для меня. Можно проверить, было ли его приложение разбито, если знать, покинул ли пользователь приложение или закрыл систему или сделал что-то подобное, или само приложение было закрыто. Если само приложение было закрыто, это означает, что оно было разбито, иначе оно не было (в таких случаях, как пользователь закрывает приложение или выключает систему).

С помощью общих настроек можно сохранить и получить переменную, которая скажет, было ли приложение разбито или нет код приведен ниже

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);
}

1) когда Android убивает и перезапускает ваше приложение, статическим переменным присваивается значение null (точнее, сначала устанавливается значение null, а немного позже, очень скоро, устанавливается их начальное значение; статический инициализатор может видеть значение null в переменных, которые еще не были инициализированы). Поэтому, если какая-то статическая переменная имеет значение null, тогда как данные в пакете говорят, что пользователь что-то делал, был перезапуск процесса (я предполагаю, что вы знаете, для чего нужен пакет в onCreate (Bundle)).

2) У вас может быть флаг в постоянном хранилище; флаг будет, скажем, установлен в true, когда приложение запустится, и установлен в false, прежде чем оно нормально завершится. Если этот флаг имеет значение true при запуске приложения, произошел сбой. (По-прежнему существует небольшая вероятность того, что приложение аварийно завершит работу после его нормального закрытия... Но так ли это важно для вас?)

3) Вы можете сохранить pid приложения в постоянной памяти (см. myPid () ).