2015-05-29 2 views
1

Я использую пользовательский обработчик исключений, который определен в классе Application:Android не может убить приложение. Применение перезапускает

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
     { 
      @Override 
      public void uncaughtException(Thread thread, Throwable ex) 
      { 
       StringWriter stackTrace = new StringWriter(); 
       ex.printStackTrace(new PrintWriter(stackTrace)); 
       StringBuilder errorReport = new StringBuilder(); 
       errorReport.append("************ CAUSE OF ERROR ************\n\n"); 
       errorReport.append(stackTrace.toString()); 

       errorReport.append("\n************ DEVICE INFORMATION ***********\n"); 
       errorReport.append("Brand: "); 
       errorReport.append(Build.BRAND); 
       errorReport.append(LINE_SEPARATOR); 
       errorReport.append("Device: "); 
       errorReport.append(Build.DEVICE); 
       errorReport.append(LINE_SEPARATOR); 
       errorReport.append("Model: "); 
       errorReport.append(Build.MODEL); 
       errorReport.append(LINE_SEPARATOR); 

       File root = android.os.Environment.getExternalStorageDirectory(); 
       String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date()); 

       File dir = new File(root.getAbsolutePath() + "/.helper/crashes/"); 
       if (!dir.exists()) { 
        dir.mkdirs(); 
       } 

       File file = new File(dir, "log.txt"); 

       try { 
        BufferedWriter buf = new BufferedWriter(new FileWriter(file, true)); 
        buf.append(currentDateTimeString + ":" + errorReport.toString()); 
        buf.newLine(); 
        buf.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       android.os.Process.killProcess(android.os.Process.myPid()); 
       Runtime.getRuntime().exit(1); 
      } 
     }); 

В OnCreate в MainActivity я имитировать исключение:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setContentView(R.layout.activity_root); 
    throw new NullPointerException("Example"); 
} 

Application был убит, но немедленно перезапускается. И это происходит бесконечно. Что я делаю неправильно?

ответ

0

В моем случае я просто поменять местами строки:

android.os.Process.killProcess(android.os.Process.myPid()); 
Runtime.getRuntime().exit(1); 

в

Runtime.getRuntime().exit(1); 
android.os.Process.killProcess(android.os.Process.myPid()); 
0

Я думаю, что ОС Android интерпретирует, что это крушение в действии. ОС автоматически восстановит активность.

В вашем случае это основное мероприятие.

0

Это нормальное поведение, и вы не делаете ничего плохого.

Возможно, вы активируете функцию android:finishOnTaskLaunch="true", чтобы предотвратить ее перезапуск (не проверено, но подробности можно найти здесь: http://developer.android.com/guide/topics/manifest/activity-element.html#finish).

Вы также можете узнать немного о том, что происходит, когда приложение неожиданно отключается, если вы посмотрите ответ, отправленный Wildroid: What happens when App crashes?.

Смежные вопросы