?

Log in

No account? Create an account

Предыдущая версия | Обновление

По моим наблюдениям, 95% программистов, которые пишут программы на Android, сталкиваются с одной очень простой, и в тоже время неприятной проблемой. Итак.


Проблема: Вы написали приложение, и размещаете его в Android Market. Счастливый пользователь его скачивает и в нетерпении запускает. Поигравшись какое-то время, он сворачивает приложение, нажав стандартную для Android кнопку "Home". Через некоторое время он снова решает воспользоваться вашим приложением, запускает его, играется, и тут у него появляется непреодолимое желание поменять свое музыкальное сопровождение. Он, снова сворачивает его. Меняет музыку, и запустив обнаруживает, что приложение стартонуло с нуля. Как будто бы Android и не поддерживает понятие "приложение в фоне". Так повторяется несколько раз. Пользователь уже готов проклясть вас, за такое кривое приложение. Все расстроены.


Описание: На самом деле не все так печально, и вы написали, скорее всего, свое приложение верно. Только не учли один момент. И так. Если бы пользователь не был так нетерпелив, и после установки свернул Android Market, и удосужился запустить ваше гениальное приложение с главного экрана - у него бы не было такой проблемы. Но почему тогда, такая разница в работе? Почему в одном случае android не восстанавливает приложение, а в другом - все в порядке? И почему все зависит от того откуда запускается приложение в первый раз? Ответ оказывается очень простым. Приложение на самом деле не перезапускается. На самом деле, состояние сохранено полностью. И если пользователь, после второго запуска нажмет кнопку "Назад" он увидит в точности тот экран, с которого он ушел. По сути приложение просто снова открывает главный экран, поверх того, что уже было открыто.


Причины: Проблема кроется в том, как Android восстанавливает приложение из фона. По сути приложение не является чем-то монолитным. Каждое приложение в Android состоит из, так называемых, задачь. Если не задумываться о чем именно идет речь - то задача одна. И так, при запуске приложения (на самом деле при любом вызове startActivity(...)), Android пытается понять, какое activity ему запустить. После он определяет, к какой задаче оно относится. Если задача не запущена, то Android запускает ее, и использует текущее событие, что бы пометить его как "активационное" (это моя терминология, и не имеет ничего общего с документацией Google). Если задача уже запущена, то Android сравнивает текущее событие с "активационным" и если они совпадают, просто восстанавливает задачу. Если же события не совпали, то просто запускает новое Activity. В данном же случае многие приложения, запускают другие приложения при помощи событий отличных от событий главного экрана. Соответственно, когда мы пытаемся восстановить приложение свернутое в фон при помощи главного экрана, то если первый запуск приложения происходил не с него - нас ждут проблемы.


Решение: Я пробовал множество вариантов. У каждого есть свои достоинства и недостатки, но самым оптимальным я признал следующий. Надо просто перезапустить программу с правильным событием. Просто вставляем в самое начало onCreate() следующий код.


if (getIntent().getAction() == null || 
    !getIntent().getAction().equals(Intent.ACTION_MAIN) ||
    getIntent().getCategories() == null || 
    getIntent().getCategories().size() != 1 || 
    !getIntent().getCategories().contains(Intent.CATEGORY_LAUNCHER) ||
    getIntent().getFlags() != (Intent.FLAG_ACTIVITY_NEW_TASK | 
                                  Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)) {
        finish();
        startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).
                      setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
                                   | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED).
                      setPackage(getPackageName()));
        return;
}


Он просто перезапустит приложение, если вдруг оно стартует не верно. Данный рецепт работает на всех телефонах и планшетах, с которыми я работал. Удачной вам разработки.

TODO's:

История версий

Октябрь 2015
Вс Пн Вт Ср Чт Пт Сб
    123
45678910
11121314151617
18192021222324
25262728293031
Разработано LiveJournal.com
Designed by Katy Towell