Приложение Android вылетает, но не перезагружается - возобновляет работу с другой точки приложения - PullRequest
7 голосов
/ 16 ноября 2011

Соответствующее приложение уже развернуто.Я узнал о ACRA и добавлю это, чтобы узнать, почему происходят сбои приложения.

Моя проблема, однако, заключается в том, что приложение аварийно завершает работу (появится диалоговое окно с предложением «Принудительное закрытие» или «Ожидание»), но вместо полного перезапуска приложения оно возобновляется сточка до аварии произошла.Однако это вызывает проблемы, которые устраняются только после перезапуска приложения (например, внезапная потеря данных, сбои, которые не имеют смысла и т. Д.).

Так как же заставить мое приложение после сбоя просто завершить работу?(НЕ перезагружать).

Редактировать: Самая большая проблема заключается в том, что после сбоя приложения все данные в моем файле настроек исчезают до тех пор, пока приложение не будет перезапущено при его возврате.

Ответы [ 2 ]

5 голосов
/ 16 ноября 2011

Android перезапустит последнюю активную активность по умолчанию. Вместо того, чтобы заставлять его перезагружаться, лучшей стратегией будет исправление вашего приложения, чтобы действия не сбоили и не завершались корректно, даже если данные недоступны. Если вы абсолютно зависите от некоторых данных (намеренных дополнений) и по умолчанию нет, вы можете просто позвонить finish(), если он недоступен, или запустить основное / родительское действие.

Другим способом является наличие собственного обработчика исключений по умолчанию, который перезапускает основное действие и т. Д. После сообщения о сбое с помощью ACRA (я полагаю, что в функции отслеживания ошибок ACRA есть запрос на функцию).

2 голосов
/ 20 января 2015

Я знаю, что этот вопрос немного устарел, но для будущих ссылок и googlers, вот полный ответ на другой, трудно найти, вопрос stackoverflow: Приложение Android перезапускается после сбоя / принудительного закрытия


создать класс, используемый для обработки unCaughtException

public class MyExceptionHandler implements
        java.lang.Thread.UncaughtExceptionHandler {
    private final Context myContext;
    private final Class<?> myActivityClass;

    public MyExceptionHandler(Context context, Class<?> c) {

        myContext = context;
        myActivityClass = c;
    }

    public void uncaughtException(Thread thread, Throwable exception) {

        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        System.err.println(stackTrace);// You can use LogCat too
        Intent intent = new Intent(myContext, myActivityClass);
        String s = stackTrace.toString();
        //you can use this String to know what caused the exception and in which Activity
        intent.putExtra("uncaughtException",
                "Exception is: " + stackTrace.toString());
        intent.putExtra("stacktrace", s);
        myContext.startActivity(intent);
        //for restarting the Activity
        Process.killProcess(Process.myPid());
        System.exit(0);
    }
}

Затем в каждом потоке (обычно у вас есть только один, если вы не начинаете новый поток (Async или ..., ofcourse)вы знаете о потоках, если вы можете создавать новые;)), установите этот класс как DefaultUncaughtExceptionHandler

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this,
            YourCurrentActivity.class));

Помните, однако!Сделайте это на самом последнем этапе разработки вашего приложения, вы должны по крайней мере попытаться обработать все ваши исключения один за другим, прежде чем оставить их на DefaultUncaughtExceptionHandler

...