Недавно я столкнулся с проблемой процесса обновления моего приложения для Android.
Вкратце, приложение может проверить, загружено ли на сервер обновление с кодом более высокой версии. Если это так, пользователь решает, следует ли обновлять. После этого приложение загружается и начинается стандартная установка:
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive");
startActivity(intent)
Проблема в том, что когда android Intent заканчивает установку, "теоретически" активность с информацией "Приложение установлено" и 2 кнопки "Готово", "Открыть". Я написал «теоретически», потому что до сих пор встречал следующие сценарии:
Приложение установлено, отображается активность с сообщением «Приложение было установлено», пользователь нажимает «Открыть», но ничего не происходит (Android 2.3.*) или приложение действительно открывается правильно — такое поведение является случайным.
Приложение установлено, активность с сообщением "Приложение установлено" отображается, но внезапно исчезает.
Пытаясь обойти эту ошибку (?), я нашел http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED. BroadcastReceiver, который я реализовал, запустил Launch Activity и, скажем так, каким-то образом это было правильное решение.
<receiver android:name=\".MyReceiver\" >
<intent-filter>
<action android:name="android.intent.action.ACTION_PACKAGE_REPLACED" />
//Or from API 12 <action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
Это решение пришлось изменить, потому что приложения с более низким API (ниже 12) не могли обрабатывать ACTION_MY_PACKAGE_REPLACED, поэтому я реализовал поведение, зависящее от API, которое:
разрешена нормальная установка обновленного приложения и запуск приложения из Activity с помощью кнопки «Готово»/«Открыть» (API ‹ 12)
запустил приложение обновления через MyReceiver после того, как отметил ACTION_MY_PACKAGE_REPLACED.
Это мое текущее решение.
Мои вопросы:
почему обновленное приложение открывается случайным образом после нажатия «Открыть» после установки в Android с API ниже 12?
почему пропадает активность с кнопками "Готово"/"Открыть" на устройствах с более высоким API?
Я пытался завершить приложение перед установкой, но это не помогло.
Мое объяснение состоит в том, что после процесса установки новый пакет должен перезаписать старый, поэтому старый пакет нужно просто удалить, и это основная причина исчезновения активности запуска.
Как я уже писал, это мое текущее решение, и я не удовлетворен. Если кто-то может прояснить этот вопрос, я был бы очень признателен.
Спасибо за прочтение.
Редактировать:
Хорошо, решение очень простое: для успешного обновления нужно запустить Intent как новую задачу (а-а-а...):
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);