Android: ручка приложения сбой и запуск определенного действия

У меня есть приложение, и если приложение выходит из строя в определенном действии, оно перезапускается в одной из промежуточных родительских действий.

Это проблема для меня, так как у меня есть некоторая введенная информация о пользователе, которая потеряна после сбоя.

Есть ли способ заставить приложение запускаться с экрана запуска после перезапуска после сбоя?

Спасибо.

Ответ 1

Предлагаемое решение 1 -

Добавьте этот тег android:clearTaskOnLaunch="true" в файл manifest.xml к вашему основному действию, которое должно всегда запускаться.

Вероятная причина, почему это не сработало

Когда приложение выходит из строя, оно выдает Exception, и нам нужно обрабатывать Exception, и в противном случае мы не получили ожидаемое поведение

Предлагаемое решение 2

Попробуйте обработать любое неперехваченное исключение и сообщить системе, что делать. Чтобы реализовать это, попробуйте выполнить следующие шаги.

  • Создайте класс, расширяющий Application Класс
  • Обработать uncaughtException в подклассе Application.
  • В своем пусковом устройстве Activity вызовите класс Application.
  • После того, как вы поймаете Исключение, запустите свой основной Activity (согласно вашему требованию).

Пример кода

Шаг 1 и 2

package com.casestudy.intentsandfilter;

import android.app.Application;
import android.content.Intent;

public class MyApplication extends Application
{
    @Override
    public void onCreate() {

        super.onCreate();

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

    private void handleUncaughtException (Thread thread, Throwable e) {

        // The following shows what I'd like, though it won't work like this.
        Intent intent = new Intent (getApplicationContext(),DrawView.class);
        startActivity(intent);

        // Add some code logic if needed based on your requirement
    }
}

Шаг 3

public class MainActivity extends Activity {

    protected MyApplication app;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // Get the application instance
        app = (MyApplication)getApplication();

        .............
    }
}

Шаг 4

Измените метод ниже, согласно вашему требованию

private void handleUncaughtException (Thread thread, Throwable e) {

    // The following shows what I'd like, though it won't work like this.
    Intent intent = new Intent (getApplicationContext(), HomeActivity.class);
    startActivity(intent);

    // Add some code logic if needed based on your requirement
}

Ответ 2

Я бы рекомендовал использовать библиотеку, такую ​​как

https://github.com/Ereza/CustomActivityOnCrash

Поскольку библиотека позаботится о других вещах вместе с различными версиями android.

введите описание изображения здесь

Ответ 3

Сначала создайте и установите класс App в вашем AndroidManifest.xml и

android:name=".App"
android:clearTaskOnLaunch="true"

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

public class App extends Application {
@Override
public void onCreate() {
    super.onCreate();
     Thread.setDefaultUncaughtExceptionHandler(
            new Thread.UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(Thread thread, Throwable e) {
                    Log.d("AppCrash", "Error just lunched ");
                }
            });
}}

Скриншот журнала отладки:
Debug Log Screenshot

Ответ 4

Возможно, нет способа сделать это, но вы можете отметить его, чтобы вы знали, была ли эта активность запущена с помощью пользовательского действия или если она была запущена только после сбоя.

Когда вы начинаете родительскую активность, передайте что-то в намерение startActivity. Если этого нет, то он был запущен после сбоя.

Ответ 5

Мне удалось запустить основное действие с помощью intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); следующим образом:

private void handleUncaughtException (Thread thread, Throwable e)
  {
    Intent intent = new Intent (getApplicationContext(), MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
  }

Ответ 6

Вы можете обработать неперехваченные исключения с помощью библиотеки FireCrasher, выполнить восстановление из нее и отправить отзыв пользователя в виде диалога или сообщения.

Вы можете узнать больше о библиотеке в этой средней статье