Как да рестартирате автоматично приложение за Android след грешка в сблъсък или принудително затваряне?

Най-големият кошмар на разработчиците на Android е Crash или Force Close Error, който може да възникне, когато потребителят използва някое от своите приложения. Всъщност винаги се изпраща лошо съобщение до потребителя и основният риск е, че потребителят деинсталира приложението. За съжаление, не винаги можете да уловите правилно всички грешки и понякога не можете да избегнете срив или принудителна грешка. В тези конкретни случаи добър подход е да конфигурирате автоматично рестартиране за вашето приложение за Android. С този подход имате по-добри шансове да задържите потребителите на приложението си.

Имайте предвид, че можете също да се насладите на този урок във видео във Youtube:

За да започнете, трябва да създадете персонализирана реализация на клас приложения, за да получавате инстанция от вашия контекст непрекъснато:

пакет com.ssaurel.appcrash;
импортиране на android.app.Application;
импортиране на android.content.Context;
MyApplication за обществен клас разширява приложението {
 публичен статичен екземпляр MyApplication;
 @Override
 публична невалидност onCreate () {
   super.onCreate ();
   instance = това;
 }
 @Override
 обществен контекст getApplicationContext () {
   върнете super.getApplicationContext ();
 }
 публична статична MyApplication getInstance () {
   връщане екземпляр;
 }
}

Не забравяйте да добавите това приложение за приложение на вашия Android Manifest:


  <приложение
    андроид: allowBackup = "истинска"
    андроид: икона = "@ визуализиране / ic_launcher"
    Android: етикет = "@ низ / app_name"
    андроид: supportsRtl = "истинска"
    Android: тема = "@ стил / AppTheme"
    Android: име = ". MyApplication">
    <дейност android: name = ". MainActivity">
      <Намерение филтър>
        <действие android: name = "android.intent.action.MAIN" />
          <категория android: name = "android.intent.category.LAUNCHER" />
      
    
  

За да опитаме функцията за автоматично рестартиране, трябва да определим бутон в оформлението на Основната дейност. Когато щракнем върху бутона, ще сринем приложението. Оформлението ще има следната форма:


  <Бутон
    андроид: layout_width = "wrap_content"
    андроид: layout_height = "wrap_content"
    андроид: layout_centerInParent = "истинска"
    android: text = "Сблъскайте ме!"
    андроид: OnClick = "crashMe" />

Сега влизаме в основата на нашата функция за автоматично рестартиране. Трябва да създадете персонализирана реализация на интерфейса UncaughtExceptionHandler. Каква е целта на този интерфейс? Това е интерфейс за обработващи, които се извикват, когато Темата рязко се прекрати поради изключено изключение.
Нашата персонализирана реализация ще има следната форма:

пакет com.ssaurel.appcrash;
импортиране на android.app.Activity;
импортиране на android.app.AlarmManager;
импортиране на android.app.PendingIntent;
импортиране на android.content.Context;
импортиране на android.content.Intent;
публичен клас MyExceptionHandler реализира Thread.UncaughtExceptionHandler {
  частна дейност;
  обществен MyExceptionHandler (Дейност a) {
    дейност = a;
  }
  @Override
  public void uncaughtException (Тема на нишката, Throwable ex) {
    Намерено намерение = ново намерение (дейност, MainActivity.class);
    intent.putExtra ("срив", вярно);
    intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP
      | Intent.FLAG_ACTIVITY_CLEAR_TASK
      | Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity (MyApplication.getInstance (). GetBaseContext (), 0, намерение, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager mgr = (AlarmManager) MyApplication.getInstance (). GetBaseContext (). GetSystemService (Context.ALARM_SERVICE);
    mgr.set (AlarmManager.RTC, System.currentTimeMillis () + 100, в очакване на намерение);
    activity.finish ();
    System.exit (2);
  }
}

Когато се появи изключено изключение, ще бъде извикан методът uncaughtException. Ще създадем намерение да рестартираме приложението си в определения момент чрез аларма. След това приключваме текущата дейност и излизаме от приложението. Обърнете внимание, че поставяме булев параметър, за да покажем, че приложението се рестартира.

Последната стъпка е да инсталирате UncaughtExceptionHandler по време на стартирането на приложението, като извикате статичния метод setDefaultUncaughtExceptionHandler от клас Thread:

пакет com.ssaurel.appcrash;
импортиране на android.os.Bundle;
импортиране на android.support.v7.app.AppCompatActivity;
import android.view.View;
импортиране на android.widget.Toast;
MainActivity в обществен клас разширява AppCompatActivity {
 @Override
 защитена void onCreate (пакет запазенInstanceState) {
   super.onCreate (savedInstanceState);
   setContentView (R.layout.activity_main);
   Thread.setDefaultUncaughtExceptionHandler (нов MyExceptionHandler (това));
   if (getIntent (). getBooleanExtra ("срив", невярно)) {
     Toast.makeText (това "Приложението се рестартира след срив", Toast.LENGTH_SHORT) .show ();
   }
 }
 публична невалидна катастрофа (View v) {
   хвърляйте нов NullPointerException ();
 }
}

Обърнете внимание, че стартираме NullPointerException в метода на crashMe, за да принудим срива на приложението и да тестваме функцията за автоматично рестартиране. Друго, което трябва да се отбележи, е тестът на булевия параметър за срив при стартиране на дейността. Както каза по-рано, тя ни позволява да знаем кога приложението се рестартира след срив или кога приложението се стартира за първи път.

Сега можете да стартирате приложението и след щракване върху бутона crashMe трябва да видите следния екран: