Закрытие всех открытых действий при вызове `uncaughtException`

Что я хочу сделать, так это закрыть все открытые действия, когда есть какое-либо необработанное исключение.
У меня есть BaseActivity, который является базовым для всех действий в моем приложении и каждого действия, производного от этого класса.
Я вызвал setDefaultUncaughtExceptionHandler в onCreate из BaseActivity.

У меня есть BaseActivity, как показано ниже:

public abstract class BaseActivity extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        // Exceptions that are not handled are received in GlobalExceptionHandler class              
        Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
    }

    public class MyExceptionHandler implements UncaughtExceptionHandler 
    {  
        @Override  
        public void uncaughtException(Thread thread, Throwable e) 
        {
            String report = "";

            // Code to generate report string
            ......
            // Code to generate report string

            // Start error screen 
            Intent intent = new Intent(mContext, ErrorScreen.class);
            intent.putExtra("error", report);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);

            // Exit
            System.exit(0);
        } 
    }
}

Вот моя активность ErrorScreen:

public class ErrorScreen extends Activity implements OnClickListener
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.error_screen_layout);

        // Display error report from intent
    }

    @Override
    public void onClick(View view) 
    {
        switch(view.getId())
        {
            case R.id.btn_exit_app:
            {
                // All this is not working
                // and few activities are still there 
                finish();

                android.os.Process.killProcess(android.os.Process.myPid());

                System.exit(1);
            }
            break;
        }
    }
}

При любом необработанном исключении вызывается моя функция uncaughtException, что, как и ожидалось, затем я запускаю новое действие для отображения сведений об ошибке и кнопку для выхода в ErrroScreen действии.

Но проблема в том, что после нажатия кнопки выхода из приложения закрываются не все действия в приложении, открытых действий все еще мало, как закрыть все открытые действия?


person User7723337    schedule 04.05.2015    source источник


Ответы (1)


private Thread.UncaughtExceptionHandler androidDefaultUEH;

private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread thread, Throwable ex) {
        //mInstance.startActivity(new Intent(mInstance, HomeActivity.class));
        Log.e("TestApplication", "Uncaught exception is: ", ex);
        // here I do logging of exception to a db
        Toast.makeText(getApplicationContext(), "Something went wrong..... TimesNow App is restarting...", Toast.LENGTH_SHORT).show();

        PendingIntent myActivity = PendingIntent.getActivity(getApplicationContext(),
                192837, new Intent(getApplicationContext(), ToBeOpenedActivity.class),
                PendingIntent.FLAG_ONE_SHOT);

        AlarmManager alarmManager;
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                15000, myActivity);
        System.exit(0);

        androidDefaultUEH.uncaughtException(thread, ex);
    }
};

Напишите этот метод в своем классе приложения.

person Ankit Kumar    schedule 04.05.2015
comment
Но я не хочу автоматически перезапускать свое приложение через 15000 мс, а также не хочу отображать только Toast. я просто хочу закрыть все открытые действия. это оно. - person User7723337; 04.05.2015
comment
значит ты хочешь закрыть приложение?? - person Ankit Kumar; 04.05.2015
comment
да, я просто хочу отображать информацию об ошибке, и когда пользователь выбирает кнопку выхода из приложения, я хочу полностью закрыть приложение. - person User7723337; 05.05.2015