Установите через OTA, приложение запускается с заставки при сворачивании и повторном входе - PullRequest
4 голосов
/ 24 октября 2011

Проще говоря, я пишу приложение для Splash, Home, Child1 и Child2 со следующим потоком: Splash -> Home -> Child1 -> Child2. И мы можем вернуться из Child2 в Child1, из Child1 в Home и обратно из Home для выхода из приложения.

Звучит просто. Я могу правильно перемещаться между этими экранами.

Проблема при установке приложения через OTA. После введите Splash -> Home -> Child1 -> Child2. Оставаясь Child2, я нажимаю кнопку HOME, чтобы свернуть приложение, и снова войти в приложение, выбрав значок приложения. Но при повторном входе в приложение оно не возобновляется на Child2, а начинается с Splash -> Home. Я не могу понять, что здесь происходит. Вместо этого оно должно возобновиться в Child2.

Еще более удивляет то, что на главном экране, когда я нажимаю кнопку НАЗАД, чтобы существовать приложение, теперь Child2 возобновляется (o_O). А из Child2 теперь я могу вернуться к Child1 и в Home, и снова вернуться в существующее приложение.

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

Может кто-нибудь сказать мне, что происходит в моей ситуации? Любая помощь приветствуется

Большое спасибо.

P / S: я получаю эту ошибку при тестировании на Nexus 1 (Android 2.2) и Nexus S (Android 2.3.x)

Редактировать: даже Приложение CNN для Android все еще имеет эту проблему ... Это относится к ОС?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2011

Это связано с сродством к задаче Я думаю. И это не только приложение CNN, все приложения ведут себя так, потому что некоторые разработчики (как я!) Не понимают, как работает концепция задачи. Я не буду лгать тебе, даже я не понимаю этого все время.

Я считаю, что это происходит потому, что, когда вы запускаете свое приложение из Маркета, оно становится частью задачи Маркет. Следовательно, у вас есть экземпляр, который «принадлежит» задаче Market. Вы можете нормально перемещаться из него. Все проблемы случаются при нажатии Home, потому что ...

Если вы запускаете действие из Launcher, вы запускаете для приложения задачу new , предоставляя вам 2 "экземпляра" приложения, один из которых принадлежит предыдущей задаче Market, а другой - вашему. собственное приложение (где вы находитесь в корне своей задачи).

В этом новом задании вы можете вернуться назад, и в конечном итоге вы достигнете предыдущего задания, в котором есть еще один экземпляр вашего приложения. Вы достигнете точки, где вы остановились (учитывая обычный режим запуска для действий). Иногда это странно, потому что мы обычно думаем, что у одного приложения есть только один экземпляр, когда оно работает не так, как оно должно работать. Я сравниваю это с двойным запуском приложения в Windows с двумя открытыми окнами. В Android эта аналогия аналогична (по крайней мере, мне).

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

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

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

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

Удачи!

0 голосов
/ 09 ноября 2011

Глядя на свой комментарий, вы убиваете свои действия, как только начинаете новую ..

Например, если вы делаете:

startActivity(intent);
finish(); // THIS WILL KILL THE ACTIVITY -> MAKING IT UNREACHABLE

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

Удалите

finish(); // REMOVE THIS TO KEEP IT ON THE ACTIVITY STACK

после вызова startActivity (намерение), и все ваши действия должны остаться в памяти.Следовательно, они будут доступны, когда вы вернетесь.ПРИМЕЧАНИЕ: для Splash вы действительно должны вызывать finish (), так как вы не хотите возвращаться к активности Splash после успешного запуска!

...