2013-08-10 3 views
3

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

Мой код

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); 

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

Вопрос заключается в

Я также использовать Broadcast Receiver для Re-открыть мое приложение

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" /> 
+2

Всякий раз, когда вы устанавливаете apk, если существует предыдущая версия приложения, она будет полностью остановлена ​​* специально, чтобы ее можно было обновить *. Я не пробовал это сам, но, возможно, [это] (http://stackoverflow.com/questions/15572154/auto-restart-app-after-market-update) может помочь вам перезагрузить приложение. –

+0

Я Пытаюсь Это также .. http://stackoverflow.com/questions/15572154/auto-restart-app-after-market-update –

+0

То же самое, о чем я говорил в своем комментарии. –

ответ

7

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

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

трюк номер 1:

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

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

трюк номер 2:

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

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

трюк номер 3:

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

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

+0

Спасибо @Tal Kanel Но я уже сделал это исправление его работы, но я хочу снова открыть его из своего приложения. –

+0

@KaranMavadhiya: как насчет второго варианта, который я предоставил? –

+0

Не нужно, чтобы установка была выполнена в течение 30-50 секунд, поэтому трюк 3 бесполезен. –

2

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

Вы можете просто добавить 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);