Do not keep activities

    Не сохранять операции


    «Не сохранять операции» — именно таким странным образом переведена фраза «Do not keep activities» в настройках Android. А описание «Удалять все операции сразу после их завершения пользователем» не добавляет ясности. Включается она в меню «Параметры разработчика» (Developer Options), находится в самом низу.

    Работает эта настройка очень просто, когда она включена, все неактивные активити умирают. Т.е. после перехода из активити A в активити B, активити A уничтожается. Таким образом можно проверить насколько вписывается ваше приложение в activity lifecycle.

    Не хочется вдаваться в подробности lifecycle, но, в двух словах, система убивает фоновую активити когда захочет. В реальности это происходит не так редко, так что не стоит этим пренебрегать. Например, вам кто-то позвонил. Во время вашего разговора система может убить активити приложения, которым вы только что пользовались.

    Или, самый простой способ убить активити — повернуть экран (если не android:configChanges=«keyboardHidden|orientation|screenSize»). Но не все приложения поддерживают поворот экрана. Да и те, которые поддерживают, встречаются с ошибками lifecycle на этапе разбработки, так что у них как раз проблем и не должно быть. Второй простой способ — сменить язык устройства.
    Ну и разумеется можно просто включить «Do not keep activities».

    Я потратил несколько дней на исправление ошибок, после того как прошелся по своему приложению с «Do not keep activities». Теперь, думаю, стоит всегда включать эту настройку на время разработки. Главной моей проблемой было корректное подключение социальных сетей в приложении.

    Почти не возникло проблем с Вконтакте, с их SDK можно написать все правильно, но все таки есть у них небольшая проблема. А именно, после авторизации через приложение, результат возвращается в onActivityResult. По документации, нужно вызвать
    VKUIHelper.onActivityResult(requestCode, resultCode, data);
    

    однако, в случае уничтожения активити нашего приложение, вылетит NPE, поэтому сначала нужно вызвать
    VKUIHelper.onResume(this);
    

    Не совсем очевидно, да и незадокументировано. Завел issue, на всякий.

    Были проблемы с Facebook, потому как, по глупости своей, я решил использовать android-simple-facebook, а ее автор, как я понял, не особо парился по поводу android lifecycle. Пришлось полностью от него отказаться и переделывать все на официальный SDK Facebook и все проблемы ушли. Хотя, наверное, можно было и так все поправить одной строчкой, но пути назад уже не было.

    И совсем не было проблем с Twitter, потому что все работает просто, как топор. У них просто нет своего SDK и авторизации через приложение. Приходится делать все по старинке, через WebView. Вообще у них самая ужасная авторизация из всех.
    Ну да это так, лирическое отступление.

    Есть проблемы с PayPal SDK, оно просто валится везде где только можно. Благо кто-то уже завел issue до меня и наверняка они в скором будущем это поправят.

    Другие примеры


    У меня не много приложений на телефоне, да и смотреть их все мне, если честно, лень, но я не мог пройти мимо недавно вышедшего приложения хабра. Начнем, конечно же, с него. Ну и добавлю ошибку Payoneer, которую нашел случайно:)

    Хабрахабр


    Я потыкался по разным экранам и уже было расстроился, неужели все написано правильно и один лишь я делаю столько ошибок. Но нет, я таки добрался до страницы About:

    Caused by: java.lang.NullPointerException
           at ru.habrahabr.activity.about.AboutFragment.onAttach(AboutFragment.java:44)
    

    Payoneer


    Много времени не понадобилось. Экран логина, ушел в keepass за паролем, вернулся — гипс крэш:

    Caused by: java.lang.NullPointerException
                at com.payoneer.android.ui.fragment.LoginFragment.initializeOnCreateData(LoginFragment.java:379)
                at com.payoneer.android.ui.fragment.LoginFragment.onCreate(LoginFragment.java:152)
    


    Ещё есть некоторые приложения без крэшэй, но с неправильным поведением, например, не сохраняется открытый фрагмент, а вместо него, после пересоздания, снова показывается главный экран приложения.

    P.S.


    Используйте настройку «Do not keep activities», надеюсь для кого-то эта информация окажется новой и поможет избежать ошибок поведения и крэшэй.
    Думаю тоже смог бы избежать кучи репортов в Google Play, если бы сразу знал об этой настройке.

    Ах да, репорты отправил.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 3
    • 0
      Спасибо за информацию. Вы не могли бы отправить описание проблемы с приложением Payoneer на community@payoneer.com?
      • +1
        Я уже отправил репорт, должен был появится в гугловой консоле. Но все же продублировал ошибку на указанный вами e-mail.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.