Обновить версию моего приложения

Я разрабатываю не общедоступное приложение для Android, то есть приложение не будет доступно на глобальном Android Market. Приложение будет установлено на ограниченное число клиентов, например, с помощью файла apk. У меня есть .apk на SD-карте, и я пытаюсь обновить приложение из своего приложения. Для этого я использую намерение

Мой код

Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/" +"Test.apk")), "application/vnd.android.package-archive"); startActivity(intent); 

ПРИМЕЧАНИЕ. Он работает нормально, но после его обновления приложение будет закрыто.

Вопрос: « Как предотвратить это? »

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

 public class AutoStart extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ Intent i = new Intent(context, ABCActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); }else{ Intent i = new Intent(context, XYZActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } 

Проблема 1: – Невозможно повторно открыть активность, когда

"android.intent.action.PACKAGE_ADDED",

"android.intent.action.PACKAGE_INSTALL",

"android.intent.action.PACKAGE_CHANGED"

 <receiver android:name=".AutoStart" android:enabled="true" android:exported="true" > <intent-filter android:priority="100" > <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_INSTALL" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_CHANGED" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" /> </intent-filter> </receiver> 

"Android.intent.action.BOOT_COMPLETED" Работает правильно

Разрешения

 1 > <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 2 > <uses-permission android:name="android.permission.RESTART_PACKAGES" /> 3 > <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

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

Если бы мне пришлось реализовать такую ​​функцию, я бы решил проблему следующим образом:

Трюк № 1:

Создавая еще одно приложение (которое каким-то образом будет установлено и на вашем устройстве пользователя), что он только рулон, должен действовать как «сторожевая собака»: это приложение будет слушать установочные трансляции, а поскольку это другое приложение, то тот, кто был Установлен – у него не будет проблем с запуском в «оригинальное приложение».

Конечно, не забывайте, что пользователю нужно будет «запустить» по крайней мере одно это приложение для сторожевого пса, потому что из приемников android 4 не будет работать, пока процесс приложения не начнется, по крайней мере, с него. Это по соображениям безопасности ..

Трюк № 2:

Другим вариантом было бы зарегистрировать в манифесте ваше приложение также для передачи ACTION_TIME_TICK . Вы можете рассчитывать на то, что эта трансляция будет называться каждое количество секунд, и реализовать, когда она получит некоторую логику, которая распознает, нужно ли прямо сейчас приложению запускать основное действие или нет.

Этот подход будет работать, но из соображений производительности было бы не так хорошо, потому что процесс приложения был бы жив почти все время, потому что он реагирует на эту трансляцию. Если вас это не волнует – так это не проблема

Трюк № 3:

Предоставить pendingIntent для alarmManager непосредственно перед тем, как начать работу с установкой через 30-50 секунд после. Ожидающее намерения намерено повторно запустить ваше приложение.

Предполагая, что приложение будет установлено до тех пор – оно будет работать.

Принятый ответ неверен.

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

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/" +"Test.apk")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Попробуйте использовать android.intent.action.MY_PACKAGE_REPLACED

http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED