2016-03-11 6 views
10

Я пробовал много способов, заданных в StackOverFlow и на другом сайте, но на самом деле это не работает.Как программно обновить apk и перезапустить приложение?

Моя проблема в том, что у меня есть это приложение, которое необходимо обновить и после обновления, оно должно автоматически снова включить то же приложение (обновление).

Это мой код:

private synchronized void runRootUpdate() {  
    // Install Updated APK 
    String command = "pm install -r " + downloadPath + apkFile; 
    Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
    int test = proc.waitFor(); // Error is here. 

    if (proc.exitValue() == 0) { 
     // Successfully installed updated app 
     doRestart() 
    } else { 
     // Fail 
     throw new Exception("Root installation failed"); 
    } 
} 

private void doRestart() { 
    Intent mStartActivity = new Intent(context, MainActivity.class); 
    int mPendingIntentId = 123456; 
    PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
    System.exit(0); 
} 

Посмотрите на мою "Ошибка здесь." Мое старое приложение установит новое обновленное приложение и убьет себя, поэтому нет proc.waitFor() и вернется на начальном экране, но обновляется новое обновленное приложение. Тем не менее, мне нужно, чтобы оно вернулось к самому себе. Можно ли мне это сделать?

+0

у вас есть какие-либо решения в настоящее время ? –

+0

, как вы планируете его обновлять? это когда приложение работает на переднем плане? –

ответ

0

Обновление приложения связано с убийством всех его процессов. Вы должны установить аварийный сигнал до запуск команды pm (с задержкой более 100 мс)

0

Прежде всего, вам нужно знать, где хранить ваш файл .apk, потому что это важно при обновлении приложения.

Чтобы обновить и запустить приложение тихо, вам необходимо выполнить следующие шаги.

Убедитесь, что у вас есть последний файл .apk в вашем SDCard при обновлении вашего application.If она оказывает затем запустить его с помощью намерения, как показано ниже для обновления

File file = new File(Environment.getExternalStorageDirectory(), "app-debug.apk"); // mention apk file path here 
       if (file.exists()) { 
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
        startActivity(intent); 
       } else { 
        Toast.makeText(UpdateActivity.this, "file not exist", Toast.LENGTH_SHORT).show(); 
       } 

Приведенный выше код будет обновить приложение с по умолчанию поведение андроида.

Создать широковещательный приемник, который будет знать, когда обновление выполняется

<receiver android:name=".receiver.OnUpgradeReceiver"> 
       <intent-filter> 
// Note: This intent can is available starting from API 12 
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
       </intent-filter> 
      </receiver> 

если вы используете ИЗА> 12 использование

<action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
        </intent-filter> 

если вы имеете апи < = 12 использование

<action android:name="android.intent.action.PACKAGE_REPLACED" /> 
    <data android:scheme="package" android:path="your.app.package" /> 

Создать широковещательный приемник для получения трансляции после обновления и запуска деятельности которого вы хотите

Пример:

public class OnUpgradeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // launch your fav activity from here. 
    } 
} 

Над радиовещательного приемника позволяет запускать приложения молча.

Надейтесь, что это вам поможет.

+0

Спасибо за ваш ответ. Но приложение должно обновлять себя тихо, без подсказки. –

+0

, тогда их не должно быть, потому что это поведение по умолчанию для Android. –

7

Вместо того, чтобы устанавливать будильник, для этого специально зарегистрирован транслятор BroadcastReceiver.Он может либо слушать android.intent.action.PACKAGE_REPLACED (обратите внимание: слово действие отсутствует эта константа) или android.intent.action.MY_PACKAGE_REPLACED

<receiver android:name="..."> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACED"></action> 
     <data android:scheme="package" android:path="com.your.package" /> 
    </intent-filter> 
</receiver> 

После переустановки приемника получит это сообщение, и вы будете в состоянии начать активность

+0

Не знаю, почему этот ответ настолько распространен, что вещательный приемник никогда не получал намерения для меня. –

+0

Для получателя, зарегистрированного в манифесте - не является программным по активности? –

+0

Да, зарегистрировано в манифесте. –

0

Хм ... Зачем использовать этот жесткий метод, когда вы используете корневую установку? Почему бы не попробовать создать простой скрипт для обновления приложения? Тогда вам не нужно устанавливать сигнализации и делать другие вещи:

Script (How to pass arguments, How to start app from terminal):

am kill com.myapp.package 
pm install -r $1 
am start -n packageName/pkgName.ActivityName 

App код:

String command = "sh script.sh " + downloadPath + apkFile; 
Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
+0

В чем смысл '' sh script.sh '', это путь к скрипту? Может ли он быть создан как файл для чтения позже? –

+0

sh - команда оболочки для выполнения скриптов script.sh - это патч для скрипта, и да, вы можете создать его как файл. –

+0

Это он. Спасибо! –

Смежные вопросы