2016-03-11 5 views
10

Ho provato molti modi in StackOverFlow e in altri siti Web ma non funziona.Come faccio ad aggiornare l'apk in modo programmato e riavviare l'app?

Il mio problema è che ho questa applicazione che ho bisogno di aggiornare e dopo l'aggiornamento, dovrebbe girare automaticamente la stessa applicazione (aggiornata) di nuovo.

Questo è il mio codice:

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

Date un'occhiata al mio "errore è qui". La mia vecchia app installerà una nuova app aggiornata e si ucciderà da sola, quindi non ci sarà proc.waitFor() e tornerà indietro nella schermata principale, MA la nuova app aggiornata verrà installata. Tuttavia, ho bisogno di girarlo di nuovo su se stesso. C'è un modo per farlo?

+0

hai qualche soluzione ora ? –

+0

come si pianifica di aggiornarlo? è acceso quando la tua applicazione sta eseguendo inn inneground? –

risposta

0

L'aggiornamento di un'applicazione comporta l'abbattimento di tutti i suoi processi. È necessario impostare l'allarme prima del avviando il comando pm (con più di 100 ms di ritardo)

0

Prima di tutto è necessario sapere dove memorizzare il file .apk perché è importante durante l'aggiornamento dell'applicazione.

Per aggiornare e avviare l'applicazione in modo silenzioso è necessario attenersi alla seguente procedura.

Assicurarsi di disporre ultimo file .apk nella vostra sdcard, mentre l'aggiornamento del application.If che sta avendo poi lanciarlo tramite intento come qui di seguito per l'aggiornamento

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

Sopra codice sarà aggiornare l'applicazione con predefinito comportamento di Android.

Creare un ricevitore di broadcast che sapere quando l'aggiornamento viene eseguito

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

se si utilizza API> 12 utilizzo

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

se si hanno API < = 12 utilizzo

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

Creazione di un ricevitore di trasmissione per ottenere in onda dopo l'attività di aggiornamento e di lancio che si desidera

Esempio:

public class OnUpgradeReceiver extends BroadcastReceiver { 

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

Sopra ricevitore Broadcast consente di lanciare l'applicazione in silenzio.

Spero che questo ti aiuti.

+0

Grazie per la risposta. Ma l'applicazione dovrebbe aggiornarsi in silenzio, senza prompt. –

+0

quindi il loro non dovrebbe essere in alcun modo perché è il comportamento predefinito di Android. –

7

Invece di impostare un allarme, è necessario trasmettere un BroadcastReceiver manifestato appositamente per questo scopo.E 'possibile ascoltare android.intent.action.PACKAGE_REPLACED (nota: l'azione di parola non è presente questa costante) o per 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> 

Dopo reinstallare il ricevitore otterrà questo messaggio e sarete in grado di avviare un'attività

+0

Non so perché questa risposta è così in voga perché il destinatario della trasmissione non ha mai avuto l'intento per me. –

+0

Per un ricevitore registrato nel Manifesto - non programmatico su un'attività? –

+0

Sì, registrato nel manifesto. –

0

Hmm ... Perché usare questo metodo duro quando si utilizza l'installazione di root? Perché non provare a creare uno script di shell semplice per aggiornare l'app? Poi si Non tiratevi deve impostare allarmi e fare altre cose:

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

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

Qual è il significato di '" sh script.sh "', è il percorso dello script? Può essere creato come un file da leggere in seguito? –

+0

sh è il comando shell per l'esecuzione degli script script.sh è una patch per lo script e sì è possibile crearlo come file. –

+0

Questo è tutto. Grazie! –

Problemi correlati