2014-12-17 18 views
0

Я хотел избежать краха приложения, а затем я разработал метод uncaughtException, чтобы вызвать другое действие; он отлично работает. Если приложение вылетает из любой активности, вызывается исключение uncaughtException и появляется моя ErrorActivity. Проблема заключается в том, что я пытаюсь закрыть приложение после сбоя. Когда я нажимаю кнопку «Назад», ErrorActivity закрывается, но затем появляется белый экран с панелью действий, и через несколько секунд снова вызывается ErrorActivity. Таким образом, закрыть приложение невозможно, за исключением того, что в приложении taskmanager завершено приложение.Android Uncaught без белого экрана

@Override 
public void onCreate() { 
    super.onCreate(); 

    Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler() 
    { 
     @Override 
     public void uncaughtException (Thread thread, Throwable e) 
     { 
      handleUncaughtException (thread, e); 
     } 
    }); 

} 

public void handleUncaughtException (Thread thread, Throwable exception) 
{ 

    StringWriter _stackTrace = new StringWriter(); 
    exception.printStackTrace(new PrintWriter(_stackTrace)); 

    Intent _intent = new Intent(); 
    _intent.setAction ("com.mypackage.ERROR_ACTIVITY"); 
    _intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); 
    _intent.putExtra("error", _stackTrace.toString()); 
    startActivity(_intent); 

    System.exit(0); 

} 
+0

Итак, вы хотите закрыть приложение onBackPressed? Почему бы вам просто не реализовать @Override onBackPressed в вашей ErrorActivity и сделать что-то вроде нового Finalizer(). KillApp (true); там? – tritop

+0

И, с другой стороны, попробуйте moveTaskToBack (true) вместо System.exit() или нового Finalizer(). KillApp (true). – tritop

+0

Я попробовал это moveTaskToBack (правда), но когда я попытаюсь открыть приложение снова, устройство перестает работать :( –

ответ

0

я узнал решение. Это просто добавьте Intent.FLAG_ACTIVITY_CLEAR_TASK, как показано ниже:

@Override 
public void onCreate() { 
    super.onCreate(); 

    Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler() 
    { 
     @Override 
     public void uncaughtException (Thread thread, Throwable e) 
     { 
      handleUncaughtException (thread, e); 
     } 
    }); 

} 

public void handleUncaughtException (Thread thread, Throwable exception) 
{ 

    StringWriter _stackTrace = new StringWriter(); 
    exception.printStackTrace(new PrintWriter(_stackTrace)); 

    Intent _intent = new Intent(); 
    _intent.setAction("br.com.magazineluiza.mobilevendas.ERROR_ACTIVITY"); 

    _intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Here is the solution 

    _intent.putExtra("error", _stackTrace.toString()); 
    startActivity(_intent); 

    System.exit(0); // or System.exit(1) It doesn't matter 

} 
0

Попробуйте это:

public void handleUncaughtException (Thread thread, Throwable exception) 
{ 

    StringWriter _stackTrace = new StringWriter(); 
    exception.printStackTrace(new PrintWriter(_stackTrace)); 

    Intent _intent = new Intent(); 
    _intent.setAction ("com.mypackage.ERROR_ACTIVITY"); 
    _intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); 
    _intent.putExtra("error", _stackTrace.toString()); 
    startActivity(_intent); 

    try { 
     runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      finish(); 
     } 
     }); 
      Thread.sleep(300); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    }  
} 
+0

Я уже пробовал, но не работал тоже –

+0

Обновлено мой ответ – Kelevandos

+0

Я попробую это спасибо –

0

Как выполнить system.exit(), когда происходит сбой приложения, это означает, что это не обычный system.exit() но это исключительный один, и это означает, что вы лучше использовать system.exit(1) скорее, это system.exit(0), и это может решить вашу проблему. это от Java Documentation "Состояние окончания. По соглашению, код состояния, отличного от нуля, указывает на ненормальное завершение.".

UPDATE:

пытаются изменить намерения флаг из NEW_TASK в CLEAR_TOP:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
+1

Я уже пробовал, но не работал. Я также пробовал system.exit (2), system.exit (10) и т. Д. –

+0

@Lennon любезно попробуйте обновление, добавленное в мой ответ –

+1

Нет, это тоже не сработало –

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