Подсчёт времени, проведённого в приложении

Рейтинг: 0Ответов: 1Опубликовано: 24.04.2015

Дано:

Приложение с двумя активити.

Задача:

Выполнение определённого действия каждые n минут, проведённых в приложении.

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

Считать, аки YandexMetrica, промежуток меж onResume() и onPause() в каждой Activity. Т.е. писать в переменную текущее время в onResume(), вычитать его из времени в onPause() и добавлять разницу в long переменную в SharedPreference. По достижении порогового значения выполнять действие и обнулять.

Возможные проблемы:

Как я понимаю, в случае падения приложения по Exception метод onPause() вызван не будет, последний промежуток не добавится.

Вопрос:

Как обойти проблему описанную выше? Есть ли иные подходы к решению проблемы?

P.S.

Сделать приложение без ошибок не предлагать)

Решение:

По подсказке @anber,

вместо onPause() в момент краха можно пользоваться обработчиком необработанных ошибок, зарегистрированном в onCreate():

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler()
{
    Thread.UncaughtExceptionHandler oldHandler=Thread.getDefaultUncaughtExceptionHandler();

    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
        Log.e(LOG, "Ошибка поймана");
        //здесь делаем то, что хотели сделать в onPause, но не успели, т.к. упали. 

        //Если используем какую-либо либу, обрабатывающую ошибки
        //ACRA, например, то надо вызвать дальнейшую обработку ошибки 
        //дефолтным обработчиком

        //Также это надо вызвать чтобы падение по ошибке со стандартным диалогом не завершилось ANR вместо него.
        if(oldHandler!=null)
        {
            oldHandler.uncaughtException(thread, ex);
        }
    }
});

Ответы

▲ 1Принят

В случае падения приложения по Exception можно вешать Thread.setDefaultUncaughtExceptionHandler(); в начале onCreate()