Come faccio a riavviare Android e l’Attività

Come faccio a riavviare Android Activity? Ho provato le seguenti, ma il Activity chiude semplicemente.

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}
  • l’attività viene chiuso a causa di u chiamato “atto.finish();” immediatamente dopo la creazione di attività…
  • obsoleto metodo
InformationsquelleAutor | 2009-09-09



20 Replies
  1. 597

    Ho fatto il mio tema switcher come questo:

    Intent intent = getIntent();
    finish();
    startActivity(intent);

    Fondamentalmente, sto chiamando finish() prima, e sto usando esattamente le stesse intento di questa attività è stato avviato con. Che sembra fare il trucco?

    AGGIORNAMENTO: Come segnalato da Ralf sotto, Attività.ricreare() è il modo di andare in API 11 e oltre. Questo è preferibile se si sta in un API11+ ambiente. È comunque possibile verificare la versione corrente e chiamare il frammento di codice di cui sopra, se siete in API 10 o al di sotto. (Si prega di non dimenticare di dare un voto positivo Ralf risposta!)

    • il problema w/ questo approccio è che anima le attività in modo che sembra scivolare dentro e fuori…
    • E che vale la pena downvoting? Che non era un requisito citato dall’OP. Esso, infatti, può essere desiderato.
    • ci dispiace ma sì, la sua goffa e sembra molto strano. non prenderla personali…
    • Beh, se non ti piace l’animazione, si può disattivare (come è dimostrato nella tua risposta). Non per questo la mia risposta è sbagliata di per sé, è solo che non mostrano alcune altre opzioni che si possono aggiungere (e che non è stato chiesto nella domanda).
    • non ho mai detto che tu la risposta era sbagliata, un basso voto non significa necessariamente sbagliato, solo che non è buono come un altro. non cercare di toot mio corno proprio qui, solo per dire che non mostrano l’animazione dà una vera “aggiorna” esperienza di un UX prospettiva.
    • Penso che ha sbagliato. Un downvote significa sbagliato/risposta cattiva, e dare un voto positivo significa che la risposta è grande. Quanto è grande la risposta è rispetto per gli altri è indicato il numero di upvotes. Vedo che si sta cercando di promuovere la tua risposta, ma stai abusando del sistema per tale scopo.
    • beh, io non voglio andare a litigare con te, permette di trovare l’accordo. penso che il voto fornisce un modo per classificare le risposte, non. vi lascio a questo. sei risposta in realtà è decente, sembra proprio strano, perché di animazione che volano dentro e fuori, non riesco a immaginare qualsiasi scenario in cui vorrei avere quell’effetto. sembra che si sta lasciando la pagina, e poi venire a destra indietro.
    • +1 – questo ha lavorato per me, e come dici tu, l’animazione è qualcosa che ho fatto, in modo che l’utente sa che è il riavvio. FWIW, ne faccio una regola di vita di non-preferenza di altri utenti risposte quando ho alternativo risposta alla domanda, anche se io di tanto in tanto votare quando la mia risposta è surclassato (non dire che è successo qui, solo che io lo faccio).
    • EboMike e Ben: Entrambe le soluzioni risposto all’OP la domanda. A votare giù qualcuno rispondere esclusivamente a causa di “estetica” la ragione è, beh, non grande. Vorrei scoraggiare chiunque dal farlo qui a Stackoverflow…
    • che cosa succede se la precedente attività chiamata utilizzando startActivityForResult ?
    • a volte (su Android 6.1) dà java.lang.SecurityException: Not allowed to start activity Intent
    • in base a sperimentare la differenza è recreate chiamerà onDestroy prima di iniziare la nuova attività. avviare manualmente l’attività di finitura e la corrente non. è necessario assicurarsi che ogni cosa sia chiuso prima di iniziare la nuova attività manualmente.

  2. 350

    A partire dalle API di livello 11 (nido d’ape), è possibile chiamare il ricreare() metodo dell’attività (grazie a questo risposta).

    Il ricreare() il metodo si comporta proprio come una modifica di configurazione, in modo che il vostro onSaveInstanceState() e onRestoreInstanceState() i metodi sono anche chiamati, se applicabile.

    • credo che questo dovrebbe essere contrassegnato come risposta corretta…
    • rapido lampeggio dello schermo non è a ll cool
    • che cosa succede se la precedente attività chiamata utilizzando startActivityForResult ?
    • Beh, la risposta corretta se non hai bisogno di supporto per nulla inferiore API 11.
    • c’è qualche funzione che fa la libreria di supporto?
    • Questo non funziona in tutti i casi. Se si dispone di una navigazione cassetto aperto durante la chiamata di ricreare() rimarrà aperta quando ricreato, il che significa che salva lo stato, che non può essere desiderabile.
    • Io sono una di quelle che non vogliono lo stato per essere salvati. A volte le persone vogliono solo un riavvio pulito, allora deve utilizzare EboMike risposta.
    • dopo la chiamata di ricreare() metodo onBackPressed() il metodo non è chiamata.

  3. 126

    Prima SDK 11, un modo per fare questo, è così:

    public void reload() {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();
        overridePendingTransition(0, 0);
        startActivity(intent);
    }
    • Su HTC Desire animazioni rimangono ancora (almeno quando utilizzato in onConfigurationChanged metodo). Non si verifica sempre, ma utilizzando EboMike codice di essi, inoltre, non si verifica sempre.
    • Questo non funziona sui principali attività avviata dal launcher. La vostra attività finire nascosto a causa di alcuni flag impostati nell’intento. Altrimenti non funziona bene.
    • Un buon punto. ha un senso perché si chiama finish() dall’attività di base della pila.
    • Chiamando questo mentre si cambia il tema dell’Attività sembra portare la velocità (senza animazioni)
    • +1 Funziona bene, per me anche con l’Attività principale. Tuttavia, si dovrebbe chiamare overridePendingTransition(0, 0); dopo finish() e startActivity(), rispettivamente, non dove lo hai chiamato …
    • è corretta, controllare i documenti per le overridePendingTransition().
    • che cosa succede se la precedente attività chiamata utilizzando startActivityForResult ?
    • sì che non si comportano correttamente. @Ralf risposta sotto è ora il modo in cui si dovrebbe fare questo.

  4. 109

    Solo combinare Ralf e Ben risposte (comprese le modifiche apportate nei commenti):

    if (Build.VERSION.SDK_INT >= 11) {
        recreate();
    } else {
        Intent intent = getIntent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();
        overridePendingTransition(0, 0);
    
        startActivity(intent);
        overridePendingTransition(0, 0);
    }
    • Miglior risposta a tutti. Crederlo o non, però, sono ancora supportando le API 3 dispositivi, e la VERSIONE.SDK_INT valore richiede API 4. 🙂
  5. 22

    Ho usato questo codice in modo che ho ancora potuto supporto vecchie versioni di Android e utilizzare recreate() sulle più recenti versioni di Android.

    Codice:

    public static void restartActivity(Activity activity){
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }

    Esempio:

    import android.app.Activity;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
        private Activity mActivity;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mActivity = MainActivity.this;
    
            Button button = (Button) findViewById(R.id.restart_button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    restartActivity(mActivity);
                }
            });
        }
    
        public static void restartActivity(Activity activity) {
            if (Build.VERSION.SDK_INT >= 11) {
                activity.recreate();
            } else {
                activity.finish();
                activity.startActivity(activity.getIntent());
            }
        }
    }
  6. 20

    Questa soluzione ha funzionato per me.

    Prima di completare l’attività e quindi avviare di nuovo.

    Codice di esempio:

    public void restartActivity(){
        Intent mIntent = getIntent();
        finish();
        startActivity(mIntent);
    }
  7. 17

    Chiamare questo metodo

    private void restartFirstActivity()
     {
     Intent i = getApplicationContext().getPackageManager()
     .getLaunchIntentForPackage(getApplicationContext().getPackageName() );
    
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
     startActivity(i);
     }

    Grazie,

    • Penso che l’OP vuole riavviare qualsiasi attività, non solo al primo, ma questo è stato utile per me.
    • Le due bandiere sono buono a sapersi, il mio caso sembrava di non fare nulla senza di loro.
  8. 16

    Anche se questo è stato risposto più volte.

    Se il riavvio di un’attività da un frammento, vorrei fare in questo modo:

    new Handler().post(new Runnable() {
    
             @Override
             public void run()
             {
                Intent intent = getActivity().getIntent();
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
                getActivity().overridePendingTransition(0, 0);
                getActivity().finish();
    
                getActivity().overridePendingTransition(0, 0);
                startActivity(intent);
            }
        });

    Quindi si potrebbe pensare che questa è un po ‘ eccessivo?
    Ma il Handler distacco consente di chiamare questo in un ciclo di vita di metodo. Ho usato questo in onRestart/onResume i metodi di verifica se lo stato è cambiato tra l’utente a tornare all’app. (installato qualcosa).

    Senza Handler se si chiama in un posto strano sarà solo uccidere l’attività e non si riavvia.

    Sentitevi liberi di porre domande.

    Applausi,
    Chris

    • Ottima soluzione e ottimo ragionamento/spiegazione per il Gestore.
    • Perché si chiama due volte al “overridePendingTransition” ?
    • Non ricordo, penso che sia stato un lavoro intorno a un bug. Si può chiamare una volta prima di startActivity() e lo farà, come detto.
    • Dopo la realizzazione di questo nel mio onResume funzione, il gioco si ferma sul mio metodo onStop e ha uno schermo nero… non so perché
    • che potrebbe essere dovuto a molte ragioni. Concludiamo l’attività qui, quindi avviare di nuovo. potrebbe essere OpenGL lancio di un traballante, ben al di fuori dell’ambito di questa domanda/risposta. Ti consiglio di aprire una nuova domanda e di riferimento di questa risposta.
    • Ciao chris, si può spiegare questo un po ‘ più “Senza che il Conduttore se si chiama in un posto strano sarà solo uccidere l’attività e non si riavvia.” ?

  9. 15

    Beh, questo non è presente, ma una combo di alcuni che già postato:

    if (Build.VERSION.SDK_INT >= 11) {
        recreate();   
    } else {
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }
    • A me funziona .. grazie .. ma voglio chiedere è: perché quando mi tolgo la prima parte del codice (quello che controlla il SDK_INT) la mia app in esecuzione, relativamente lento ?!! .. quando ho ri-collegare di nuovo il codice è in esecuzione, relativamente e, ovviamente, molto più veloce !!!
    • Non è sicuro su questo. Beh, se si utilizza un SDK che è >= 11 quindi ricreare() dovrebbe essere più veloce di ottenere l’intento, di finitura, per poi partire di nuovo. Completare chiamate codice che viene eseguito per onStop e ricreare esegue il codice come cambiamento di orientamento… quindi non è del tutto a che fare.
  10. 3

    Effettivamente il seguente codice è valido per API livelli 5 e, quindi, se il vostro target di API è inferiore a questo, vi ritroverete con qualcosa di molto simile a EboMike codice.

    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    overridePendingTransition(0, 0);
    • Non che getIntent funziona ? È deprecato rito ?
  11. 3

    C’è una hacky modo che dovrebbe funzionare su qualsiasi attività, compreso quello principale.

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

    Quando cambia orientamento, Android, in generale, a ricreare le attività (a meno che non si sovrascrivere). Questo metodo è utile per rotazioni di 180 gradi, quando Android non ricreare la vostra attività.

  12. 3
    public void onRestart() {
        super.onRestart();
        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        finish();
        act.startActivity(intent);
    }

    tenta di utilizzare questo ..

  13. 3

    In collaborazione con strano SurfaceView ciclo di vita del comportamento con la Fotocamera. Ho scoperto che ricreare() non si comporta bene con il ciclo di vita di SurfaceViews. surfaceDestroyed non è mai chiamato durante la ricreazione ciclo. È chiamato dopo onResume (strano), al punto che il mio SurfaceView è distrutto.

    Originale modo di ricreare un’attività che funziona bene.

    Intent intent = getIntent();
    finish();
    startActivity(intent);

    Io non riesco a capire esattamente il motivo è questo, ma è solo un’osservazione che può sperare di guidare gli altri in futuro, perché è risolto i miei problemi che ho avuto con SurfaceViews

  14. 3

    La soluzione per la tua domanda è:

    public static void restartActivity(Activity act){
        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        ((Activity)act).startActivity(intent);
        ((Activity)act).finish();
    }

    È necessario eseguire il cast al contesto di attività per avviare la nuova attività, nonché per completare l’attività corrente.

    Spero che questo aiuto..e funziona per me.

  15. 1

    Se si rimuove l’ultima riga, potrai creare nuova act Attività, ma la vecchia istanza sarà ancora vivo.

    È necessario riavviare l’Attività come se l’orientamento è cambiato (cioè il vostro stato è stato salvato e passato al onCreate(Bundle))?

    Se non, una possibile soluzione sarebbe quella di utilizzare un extra, il manichino Attività, che sarebbe partito dalla prima Attività, e il cui compito è quello di iniziare nuova istanza. O anche solo ritardare la chiamata di act.finish(), dopo il nuovo è iniziato.

    Se avete bisogno di salvare la maggior parte dello stato, si sono sempre in bella acque profonde, perché è non banale per passare tutte le proprietà dello stato e, soprattutto, senza perdite di vecchio Contesto/Attività, passando per la nuova istanza.

    Si prega di specificare cosa stai cercando di fare.

    • Ho un pulsante che si applica diversi temi per le app, dopo aver applicato un tema, questo viene salvato in preferenza, la principale attività si riavvia, si legge il tema di preferenza, si applica il tema onCreate(). Si scopre che il codice sopra funziona bene se l’attività non è single_instance. Non so se è la migliore pratica.
    • Attualmente, non c’è pulita, SDK lastricata di riavviare le vostre Attività, per quanto ne sappia – se non la perdita di qualcosa, si può essere buono per andare 🙂
  16. 0

    Mi chiedo perché nessuno mantionned Intent.makeRestartActivityTask() che normalmente fa esattamente questo scopo.

    Fare un Intento che può essere utilizzato per rilanciare l’attività dell’applicazione
    * nel suo stato di base.

    startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent())

    Questo metodo imposta Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK come flag di default.

  17. 0

    si può semplicemente utilizzare

    onRestart()

    metodo come segue

     @Override
        protected void onRestart() {
            super.onRestart();
            setContentView(R.layout.add_entry);
        }

    e chiamata onRestart() in cui si desidera riavviare l’Attività corrente

  18. -1

    Se si chiama da qualche frammento di fare in modo, sotto il codice.

    Intent intent = getActivity().getIntent();
    getActivity().finish();
    startActivity(intent);

Lascia un commento