Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.180.76] |
|
Сообщ.
#1
,
|
|
|
Есть приложение, которое качает и ставит другое приложение... ну или свою часть.
Установка происходит так: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "application/vnd.android.package-archive"); startActivityForResult(intent, INSTALL_APPLICATION_CODE); Т.е. оп задумке, после установки мы должны получить некий результат и запустить это приложение. Примерно так: protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); *** case INSTALL_APPLICATION_CODE: performSelection(installingFormIndex); break; *** } Все как бы хоршо, но есть одна проблема... или даже две. Первая и главная заключается в том, что после установки метод PerformSelection фактически запускает только что установленный пакет: Intent intent = new Intent(START_FORM_ACTION); intent.setDataAndType(ContentUris.withAppendedId(Forms.CONTENT_URI, form.getId()), "vnd.android.cursor.item/vnd.icertainty.form"); intent.setPackage(info.packageName); FormManager.lastOpendForm = form; startActivityForResult(intent, OPEN_FORM_CODE); Но если это происходит сразу, то приложение не запускается. Говорит, что типа установленный пакет остановлент неожиданно... с логах и че-то ничего не нашел... Скорее всего не туда смотрел. В отладчике тоже собо ничего не показывает. (Кстати, может я незнаю, как им правильно пользоваться. Про это ниже) Но, если придержать выполнение на входе performSelection то приложение открывается. (Добавлено: Тут я похоже ошибся, почему-то вариант с "подождать" больше не работает.) Т.е. такое ощущение, что на момент запуска пакет еще не доконца установлен, или система не знает, что он уже установлен... Если потом, уже из Само приложение стартаует с фоновой загрузкой данных. Достаточно длинной. Прям в onCreate запускается AsyncTask. Еще не понятно, как-то вообще можно в методе onActivityResult определить, поставил пользователь приложение или отказался от установки, По поводу правильного использования дебаггера... В нашем случае получается, что есть основное прилоежение и второе. Основное загружает второе, типа новые версии и т.п. и запускает его таким образом. Получается, что если я из эклипса запускаю отладку на втором приложении, то все равботает. А если на первом, то посмотреть почему не запускается второе не получается, т.к. отладчик на основном... Может можно как-то его подключать по особому? |
Сообщ.
#2
,
|
|
|
Цитата Felan @ Получается, что если я из эклипса запускаю отладку на втором приложении, то все равботает. А если на первом, то посмотреть почему не запускается второе не получается, т.к. отладчик на основном... Может можно как-то его подключать по особому? В DDMS Perspective можно выбрать отлаживаемый процесс. |
Сообщ.
#3
,
|
|
|
Цитата [S]mike @ В DDMS Perspective можно выбрать отлаживаемый процесс. Ага, точно... Только поулчается, что этого процесса нет в списке. Т.е. я останавливаю отладчик на performSelection. Все хорошо, должно сейчас ставиться. Запускаю, быстро переключаюсь на DDMS вью, а там прочесса этого нет. И он там так и не появляется. А падает так же... |
Сообщ.
#4
,
|
|
|
Вообще подход неправильный. Такое поведение вроде как преследуется со стороны гугла (в новом гугл маркете вроде даже не рассылается com.android.vending.INSTALL_REFERRER) и правильно. Потому как эффект упрощения пары кликов пользователю не компенсирует риск со стороны безопасности. Андроид - это loosely coupeled система, поэтому задача программы если есть компонент (пользователь поставил) - использовать, а если нет, то работать как есть
Если для установки используется маркет, то можно в onResume проверять, установлен ли нужный класс активити. То есть когда запускается маркет - вызвавшая его активити уходит в onPause, а когда маркет закроется (после установки приложения или без), то будет вызываться onResume. |
Сообщ.
#5
,
|
|
|
Цитата [S]mike @ Вообще подход неправильный. Тут сложно спорить, но пока вариантов нет. Цитата [S]mike @ в новом гугл маркете вроде даже не рассылается com.android.vending.INSTALL_REFERRER Не понимаю о чем ты. Цитата [S]mike @ Андроид - это loosely coupeled система, поэтому задача программы если есть компонент (пользователь поставил) - использовать, а если нет, то работать как есть Ну вобщем-то примерно так и есть. Цитата [S]mike @ Если для установки используется маркет, то можно в onResume проверять, установлен ли нужный класс активити. То есть когда запускается маркет - вызвавшая его активити уходит в onPause, а когда маркет закроется (после установки приложения или без), то будет вызываться onResume. Нет, к гугл-маркету это не имеет отношения. Это, если можно так сказать, корпоративное прилоежение, которое со своего сервера ставит отдельные части. Про onPause и onResume расскажи по подробнее? Может устанавливаем просто не правильно. Как я понимаю, когда вызывается Intent типа VIEW (точно не помню), текущая активити автоматически в паузу уходит. Потом происходит установка, которая не имеет отношения никакого к приложению вызвавшего Intent. Это все происходит на уровне системы. И потом, когда весь процесс завершился так или иначе (приложение об этом не должно ничего знать в принципе) вызвовшая активити сама выйдет из паузы в резьюм? Я к чему, может тогда стартавать установку без ожидания результат, как у нас сейчас, а просто. А в резьюме потом проверять, была ли установка или нет? И уже из резьюма запусть только что установленную часть? Или как? |
Сообщ.
#6
,
|
|
|
Цитата Felan @ Не понимаю о чем ты. Ну это такое сообщение, которое установщик должен отправлять после установки приложения. Вот эту диаграмму нужно в Андроиде понимать и выучить как таблицу умножения Описание: http://developer.android.com/reference/and...p/Activity.html Цитата Felan @ Как я понимаю, когда вызывается Intent типа VIEW (точно не помню), текущая активити автоматически в паузу уходит. Именно. Цитата Felan @ И потом, когда весь процесс завершился так или иначе (приложение об этом не должно ничего знать в принципе) вызвовшая активити сама выйдет из паузы в резьюм? Из паузы активити выходит перед показом его пользователю. То есть например когда установщик закроется, то по стеку будет осуществлен переход к предыдущей - то есть запускавшей этот установщик - активити. Или если пользователь сам в эту активити перейдет. Цитата Felan @ А в резьюме потом проверять, была ли установка или нет? И уже из резьюма запусть только что установленную часть? Я думаю, это оптимальное решение. |
Сообщ.
#7
,
|
|
|
Цитата [S]mike @ Вот эту диаграмму нужно в Андроиде понимать и выучить как таблицу умножения Ну да, видел, читал. Цитата [S]mike @ Из паузы активити выходит перед показом его пользователю. То есть например когда установщик закроется, то по стеку будет осуществлен переход к предыдущей - то есть запускавшей этот установщик - активити. Или если пользователь сам в эту активити перейдет. Ну да, я это и имел ввиду. Цитата [S]mike @ Я думаю, это оптимальное решение. Ну вот мне сейчас тоже так кажется. Спасибо. |