Come riavviare completamente un'applicazione?

Ho un'applicazione che avvia un servizio remoto nella sua prima attività lanciata. Quindi, in un'altra attività, l'utente può impostare la configuration dell'applicazione. Tieni presente che questa seconda attività non è legata al Servizio e non voglio legarlo.

Ora la mia domanda è: come posso riavviare l'intera applicazione dalla seconda attività, dopo aver modificato le impostazioni di configuration?

  • Android AsyncTask fornisce BadTokenException in ActivityGroup
  • Android come get l'accesso alle risorse grezze che ho messo nella cartella di res?
  • Calcolo delle size di Appwidget
  • Ordinare i dati DB e visualizzare in visualizzazione elenco
  • Come utilizzare Android AppBarLayout, Toolbar e TabLayout con frammenti
  • MediaRecorder: avvio non riuscito
  • Per ora, sto usando un button che è onClickListener:

    public void onClick(DialogInterface dialog, int which) { sauvegarde(); Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); } 

    Il problema è: riavvia l'attività corrente solo senza interrompere l'intera applicazione e quindi senza riavviare il servizio

    Qualche idea?

  • Elimina richiesta con header e Parameters Volley
  • Qual è la differenza tra ImageView.setBackgroundResource e ImageView.setImageResource?
  • Imansible stabilire una nuova connessione con aSmack 4.0.2
  • Semplice lettore mp3 di mediaplayer dal path del file?
  • Come rilevare se è necessario il PIN / password / pattern per sbloccare il telefono?
  • È ansible rilevare la disinstallazione di Android app?
  • 6 Solutions collect form web for “Come riavviare completamente un'applicazione?”

    È ansible utilizzare il sistema Androids AlarmManager come questo:

    Codice per riavviare l'applicazione nella tua attività:

     AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this.getBaseContext(), 0, new Intent(getIntent()), getIntent().getFlags())); System.exit(2); 

    Un esempio può essere esaminato qui

    AGGIORNARE

    Come ha sottolineato @ CommonsWare, è un modo cattivo per disegnare la tua applicazione, quando dovrai riavviarla (ctriggers pratica). Se vuoi veramente farlo, puoi provare a impostare l'allarme gestione per avviare l'applicazione in un secondo dopo aver ucciso il tuo process:

     AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this.getBaseContext(), 0, new Intent(getIntent()), getIntent().getFlags())); android.os.Process.killProcess(android.os.Process.myPid()); 

    prova questo

      public void reload() { Intent intent = getIntent(); overridePendingTransition(0, 0); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); overridePendingTransition(0, 0); startActivity(intent); } 

    provare questo codice,

     public void onClick(DialogInterface dialog, int which) { sauvegarde(); restart(2); } 

    riavviare il metodo

     public void restart(int delay) { Intent launchIntent = new Intent(context, YourStartUpActivity.class); PendingIntent intent = PendingIntent.getActivity(getApplicationContext(), 0, launchIntent , 0); AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC, System.currentTimeMillis() + delay, intent); System.exit(2); } 

    nella tua attività di riavvio aggiungere questo

     restart.this.finish(); getActivity(otheractivity.class).finish(); Intent in = new Intent(this,main.class); startActivity(in); 

    per ciascuna delle tue attività aggiungere attività (nome del tuo class) e quindi completare l'attività. se aggiungi la tua attività come questa, chiudi la tua applicazione e riavvii

    La soluzione di AlarmManager non può funzionare perché su kill app tutti gli intenti in sospeso possono essere rimossi. Su android-10 ho questo problema.

    Ma ho trovato altro modo – creare la class Instrumentation e call startInstrumentation su Context . Ha lavorato molto bene.

    boolean android.content.Context.startInstrumentation (class di class ComponentName, profilo di stringFile, argomenti Bundle)

    Avviare l'esecuzione di una class android.app.Instrumentation. Il componente di Strumentazione fornito verrà eseguito uccidendo l'applicazione di destinazione (se attualmente in esecuzione), avviando il process di destinazione, istanziando il componente di strumentazione e quindi lasciando guidare l'applicazione.

    Questa function non è sincrona – restituisce non appena la strumentazione è iniziata e mentre è in esecuzione.

    La strumentazione è normalmente consentita solo a correre contro un pacchetto che sia sconosciuto o firmato con una firma che anche il pacchetto di strumentazione è firmato (assicurando che il bersaglio si fida della strumentazione).

    Instrumentation deve essere definita in manifesto. Google come usarlo.

    Questa è la risposta più recente con l'ultimo aggiornamento 2017 testato e funzionante come una speranza di fascino che aiuta 🙂

      Intent i = getBaseContext(). getPackageManager(). getLaunchIntentForPackage(getBaseContext().getPackageName()); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//clear the stack i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); finish();//don`t forget to finish before starting again startActivity(i);//start the activity again 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.