Проблема с обновлением приложения Android

Недавно я столкнулся с проблемой процесса обновления моего приложения для 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 кнопки "Готово", "Открыть". Я написал «теоретически», потому что до сих пор встречал следующие сценарии:

  1. Приложение установлено, отображается активность с сообщением «Приложение было установлено», пользователь нажимает «Открыть», но ничего не происходит (Android 2.3.*) или приложение действительно открывается правильно — такое поведение является случайным.

  2. Приложение установлено, активность с сообщением "Приложение установлено" отображается, но внезапно исчезает.

Пытаясь обойти эту ошибку (?), я нашел 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);

person dawid gdanski    schedule 23.07.2013    source источник


Ответы (1)


Сначала добавьте «фильтр намерений» в манифест, как показано ниже:

`<activity android:name="com.package.MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="file" />
        <data android:mimeType="application/vnd.android.package-archive" />
    </intent-filter>
</activity>`

Затем установите флаги намерения для новой задачи:

intentAPK.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

person Andrew.T    schedule 07.07.2015