Jak automaticky restartovat aplikaci Android po zhroucení nebo chybě zavření?

Největší noční můrou vývojářů systému Android je Crash or Force Close Error, ke které může dojít, když uživatel použije jednu ze svých aplikací. Je to vždy špatná zpráva zaslaná uživateli a hlavním rizikem je, že uživatel odinstaluje aplikaci. Bohužel nemůžete vždy správně zachytit všechny chyby a někdy se můžete vyhnout Crash nebo Force Close Error. V těchto konkrétních případech je dobrým přístupem nakonfigurovat automatický restart pro vaši aplikaci pro Android. S tímto přístupem máte větší šanci udržet uživatele ve vaší aplikaci.

Tento výukový program si také můžete vychutnat ve videu na Youtube:

Chcete-li začít, musíte si vytvořit vlastní implementaci třídy aplikací, abyste nepřetržitě dostali instanci svého kontextu:

balíček com.ssaurel.appcrash;
import android.app.Aplikace;
import android.content.Context;
public class MyApplication rozšiřuje aplikaci {
 veřejná statická instance MyApplication;
 @Override
 public void onCreate () {
   super.onCreate ();
   instance = toto;
 }
 @Override
 public Context getApplicationContext () {
   return super.getApplicationContext ();
 }
 public static MyApplication getInstance () {
   návratová instance;
 }
}

Nezapomeňte přidat tuto implementaci aplikace do svého manifestu Android:


  
    
      
        
          
      
    
  

Chcete-li vyzkoušet funkci automatického restartu, musíme definovat tlačítko v rozvržení hlavní aktivity. Když klikneme na tlačítko, dojde k selhání aplikace. Rozložení bude mít následující podobu:


  

Nyní vstupujeme do jádra naší funkce automatického restartu. Musíte vytvořit vlastní implementaci rozhraní UncaughtExceptionHandler. Jaký je účel tohoto rozhraní? Je to rozhraní pro obsluhy vyvolané, když se vlákno náhle ukončí kvůli neúspěšné výjimce.
Naše vlastní implementace bude mít následující podobu:

balíček com.ssaurel.appcrash;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
veřejná třída MyExceptionHandler implementuje Thread.UncaughtExceptionHandler {
  činnost soukromých aktivit;
  public MyExceptionHandler (Activity a) {
    activity = a;
  }
  @Override
  public void uncaughtException (vlákno, Throwable ex) {
    Záměr záměr = nový Záměr (aktivita, třída MainActivity.class);
    záměr.putExtra („crash“, true);
    záměr.addFlagy (záměr.FLAG_ACTIVITY_CLEAR_TOP
      | Záměr.FLAG_ACTIVITY_CLEAR_TASK
      | Záměr.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent waitingIntent = PendingIntent.getActivity (MyApplication.getInstance (). GetBaseContext (), 0, záměr, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager mgr = (AlarmManager) MyApplication.getInstance (). GetBaseContext (). GetSystemService (Context.ALARM_SERVICE);
    mgr.set (AlarmManager.RTC, System.currentTimeMillis () + 100, waitIntent);
    activity.finish ();
    System.exit (2);
  }
}

Pokud dojde k výjimce, bude vyvolána metoda uncaughtException. Chystáme se vytvořit záměr k restartování naší aplikace v definovaném okamžiku pomocí alarmu. Poté dokončíme aktuální aktivitu a ukončíme aplikaci. Všimněte si, že jsme vložili logický parametr, který označuje, že aplikace je restartována.

Posledním krokem je instalace UncaughtExceptionHandler během spuštění aplikace voláním statické metody setDefaultUncaughtExceptionHandler třídy Thread:

balíček com.ssaurel.appcrash;
import android.os.Bundle;
importovat android.support.v7.app.AppCompatActivity;
import android.view.View;
importovat android.widget.Toast;
public class MainActivity rozšiřuje AppCompatActivity {
 @Override
 protected void onCreate (Bundle savedInstanceState) {
   super.onCreate (uloženéInstanceState);
   setContentView (R.layout.activity_main);
   Thread.setDefaultUncaughtExceptionHandler (nový MyExceptionHandler (this));
   if (getIntent (). getBooleanExtra ("crash", false)) {
     Toast.makeText (toto „Aplikace se restartovala po zhroucení“, Toast.LENGTH_SHORT) .show ();
   }
 }
 public void crashMe (Zobrazit v) {
   hodit nové NullPointerException ();
 }
}

Uvědomte si, že v metodě crashMe spustíme NullPointerException, která vynutí selhání aplikace a otestuje funkci automatického restartu. Další věcí, kterou je třeba poznamenat, je test boolean parametru při spuštění aktivity. Jak již bylo řečeno, umožňuje nám zjistit, kdy se aplikace restartuje po havárii nebo kdy je aplikace spuštěna poprvé.

Nyní můžete spustit aplikaci a po kliknutí na tlačítko crashMe byste měli vidět následující obrazovku: