2015-06-30 10 views
6

Sto cercando di capire la differenza tra onPause e onStop.Android: scenario in cui viene chiamato onPause ma non onStop?

Ho letto tutti i diversi forum ma non sono ancora chiaro della differenza. Ho creato una semplice app per provare e verificare quando viene chiamato il metodo. Per questo ho semplicemente inserito logger in ogni metodo.

Dalle mie prove -

  1. popup non chiamano entrambi i metodi
  2. commutazione ad un'altra attività chiama entrambi i metodi
  3. Tirando giù la barra di chiamate di notifica né metodo

ho ha visto solo entrambi i metodi essere richiamati in rapida successione o non essere richiamati affatto. Sto cercando di trovare scenari in cui viene chiamata onPause ma onStop no.

Lo scopo è capire se la definizione di onPause è addirittura richiesta. Se gli scenari in cui viene chiamato solo onPause sono così rari, non ha nemmeno senso scrivere codice separato per onPause. Non dovresti scrivere onStop essere sufficiente?

public class LifecycleActivity extends ActionBarActivity { 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d("Rachit", "In Destroy Method"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_lifecycle); 
     Log.d("Rachit", "In Create Method"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("Rachit", "In Start Method"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d("Rachit", "In Resume Method"); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("Rachit", "In Pause Method"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.d("Rachit", "In Restart Method"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("Rachit", "In Stop Method"); 
    } 
} 

risposta

4

L'ho capito un po 'più tardi, ma ho dimenticato di pubblicare la mia risposta qui.

L'istanza in cui ho notato che onPause() è stato chiamato, senza una successiva chiamata a onStop() è stato quando ho ricevuto una notifica da un'altra applicazione quando sul mio telefono era aperta un'altra app.

Ad esempio, supponiamo di avere Facebook in esecuzione sul telefono al momento. Se ricevi una notifica da WhatsApp (nella finestra di dialogo a comparsa), l'attività di Facebook verrà messa in pausa. Se chiudi il pop-up di WhatsApp durante questo periodo, l'attività di Facebook verrà ripresa. D'altra parte, se apri WhatsApp dal messaggio pop-up, la tua attività su Facebook verrà interrotta.

1

La pagina ufficiale Android Developers è possibile visualizzare tutte le informazioni relative a questi due stati di attività

onPause() (http://developer.android.com/training/basics/activity-lifecycle/pausing.html)

Quando il sistema chiama onPause() per la tua attività, tecnicamente significa che la tua attività è ancora parzialmente visibile, ma il più delle volte è un'indicazione che l'utente sta lasciando l'attività e presto lo sarà immettere lo stato Interrotto. Di solito dovresti usare il callback onPause() a:

Fermare animazioni o altre azioni in corso che potrebbero consumare CPU. Applica modifiche non salvate, ma solo se gli utenti si aspettano che tali modifiche siano salvate in modo permanente quando escono (come una bozza di email). Release risorse di sistema, come ricevitori broadcast, handle per i sensori (come il GPS) o qualsiasi risorsa che possa influire sulla durata della batteria mentre l'attività è in pausa e l'utente non ne ha bisogno.

In genere, non utilizzare onPause() per memorizzare le modifiche dell'utente (ad esempio informazioni personali inserite in un modulo) nella memoria permanente. La solo la volta in cui è necessario mantenere le modifiche dell'utente alla memoria permanente entro onPause() è quando si è certi che gli utenti si aspettino che le modifiche siano state salvate automaticamente (come quando si redige un messaggio di posta elettronica). Tuttavia, dovresti evitare che esegua un lavoro intensivo della CPU durante onPause(), come scrivere su un database , perché può rallentare la transizione visibile alla successiva attività (dovresti invece eseguire operazioni di spegnimento di carichi pesanti durante onStop ()).

Si dovrebbe tenere la quantità di operazioni effettuate nel metodo relativamente semplice onPause() al fine di consentire una rapida transizione alla prossima destinazione dell'utente se la vostra attività è effettivamente fermato.

Nota: quando l'attività viene messa in pausa, l'istanza dell'attività viene mantenuta in memoria e viene richiamata quando l'attività riprende. non è necessario reinizializzare i componenti che sono stati creati durante uno dei metodi di callback che portano allo stato Ripreso durante lo .

onStop() (http://developer.android.com/training/basics/activity-lifecycle/stopping.html)

Quando la vostra attività riceve una chiamata al metodo onStop(), non è più visibile e dovrebbe rilasciare quasi tutte le risorse che non sono necessaria mentre l'utente non lo sta usando. Una volta interrotta l'attività, il sistema potrebbe distruggere l'istanza se è necessario ripristinare la memoria del sistema . In casi estremi, il sistema potrebbe semplicemente terminare il processo dell'app senza richiamare la richiamata finale onDestroy() dell'attività, quindi è importante utilizzare onStop() per rilasciare risorse che potrebbero perdere memoria .

Anche se il metodo onPause() viene chiamato prima onStop(), si dovrebbe utilizzare onStop() per eseguire, più la CPU sullo spegnimento operazioni più grandi, come la scrittura di informazioni in un database.

Quando l'attività viene interrotta, l'oggetto Attività viene mantenuto residente nella memoria e viene richiamato quando si riprende l'attività. Non è necessario reinizializzare i componenti durante uno dei metodi di callback che portano allo stato Ripresa. Il sistema tiene anche traccia dello dello stato corrente per ogni vista nel layout, quindi se l'utente immette del testo in un widget EditText, quel contenuto viene mantenuto in modo che non sia necessario salvarlo e ripristinarlo.

Nota: Anche se il sistema distrugge la vostra attività mentre è ferma, conserva ancora lo stato degli oggetti vista (come testo in un EditText) in un bundle (un blob di coppie chiave-valore) e ripristini Se si l'utente torna alla stessa istanza dell'attività (la successiva lezione discute di più sull'utilizzo di un pacchetto per salvare altri dati di stato nel caso l'attività viene distrutta e ricreata).

+0

Sì, ma non ho ancora trovato un caso in cui viene chiamato onPause ma onStop non lo fa. Se vengono sempre chiamati insieme, non avrebbe più senso avere un solo metodo e salvare dati o rilasciare risorse in questo? – Rachit

+0

Il metodo onStop viene chiamato solo quando l'attività non è completamente visibile, mentre il metodo onPause viene chiamato quando l'attività è ancora visibile ma è rimasta sullo sfondo. Ad esempio, quando si visualizza una finestra di dialogo. Il dietro alla finestra di dialogo Attività è in onPause, ma se apri una nuova attività, viene passato dal metodo onPause e onStop @Rachit –

+0

Questo è il problema. Una finestra di dialogo non chiama onPause. Ho provato ad ottenere le finestre di dialogo, ma anche in questo caso la chiamata on non viene chiamata. – Rachit

4

Questo scenario si verifica quando si avvia un DialogActivity dalla vostra attività in corso, quindi la onPause() dell'attività corrente si chiama e dopo essere entrato in corrente Activity il onResume() è chiamato.

Per ulteriori informazioni, vedere Developer Docs.

+0

FWIW [questa risposta] (http://stackoverflow.com/a/7384782/1276636) per ingegnere di framework Android è un'ottima lettura. 'DialogActivity' nella risposta di Ishwar Verma è un'attività che applica lo stile di una finestra di dialogo, quindi fondamentalmente è un'attività che sembra una finestra di dialogo. – Sufian

0

Quando si avvia l'attività di dialogo dall'attività corrente in quel momento verrà chiamato solo onPause(). Es: Diciamo che abbiamo attività A e B. Ora l'attività B è attività di dialogo e l'attività A è normale Attività. quando iniziamo l'attività B dall'attività A, allora l'attività di un onPause() sarà chiamato e l'attività di B onCreate(), onStart() e onResume() sarà called.Please controlla sotto URL per il codice di esempio sample code

3

Attività A -> Attività B Se B è trasparente, verrà chiamato un onPause ma non onStop.

0

C'è un altro modo per farlo. consente di prendere uno scenario in cui la modalità di avvio dell'attività è singletask e creare una notifica da esso e attivarla e richiamare di nuovo lo stesso tentativo in sospeso quindi onresume verrà chiamato post in pausa.

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sendNotification(); 
    } 

    private final static String TAG = "TestOne"; 

    public void sendNotification(){ 
     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this); 

    //Create the intent that’ll fire when the user taps the notification// 

    Intent i = new Intent(MainActivity.this, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); 


    mBuilder.setContentIntent(pendingIntent); 

    mBuilder.setSmallIcon(R.mipmap.ic_launcher); 
    mBuilder.setContentTitle("My notification"); 
    mBuilder.setContentText("Hello World!"); 

    NotificationManager mNotificationManager = 

      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    mNotificationManager.notify(001, mBuilder.build()); 

} 

manifesto:

<activity android:name=".MainActivity" 
     android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".Main2Activity"></activity> 
Problemi correlati