Как узнать, было ли приложение android разбито в прошлый раз
У меня есть приложение для android, и я хочу знать при запуске этого приложения, разбилось ли мое приложение ранее или нет. Этот сбой может быть вызван сбоем ОС в приложении для экономии памяти или по любой другой причине. Он не может быть пойман в UnhandledExceptionHandler. То, что я обработал до сих пор, приведено ниже, и это не кэширование тех случаев, связанных с родной ОС и принудительной памятью
UncaughtExceptionHandler handler = new UncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);
Правка:
Пожалуйста, не предлагайте сторонние библиотеки.
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 () ).