2012-02-13 12 views
113

Da doc Android qui http://developer.android.com/reference/android/app/Activity.html, ha detto 'attività viene in primo piano' chiamerà onPause(), e 'Activity non è più visibile' chiamerà onStop().Differenza tra onPause e onStop()

Non è "Attività in primo piano" come "Attività non è più visibile"? Potete dirmi per favore qual è la differenza tra loro?

+11

+1 per una domanda eccellente. Inoltre, un'attività "sospesa" è ** completamente attiva ** (mantiene tutte le informazioni sullo stato e sui membri e rimane collegata al gestore delle finestre). Un'attività 'stopped' conserva anche tutte le informazioni sullo stato e sui membri, ma non è più collegata al' window manager'. – ateiob

risposta

27

Se è ancora possibile vedere qualsiasi parte di esso (Activity in primo piano o non occupa l'intero schermo o è un po 'trasparente), verrà chiamato onPause(). Se non riesci a vederne alcuna parte, verrà chiamato onStop().

Una finestra di dialogo **, ad esempio, potrebbe non coprire l'intero Activity precedente, e questo sarebbe il momento di chiamare onPause().

** Non mi riferisco a un Dialogo Android qui, piuttosto un'idea concettuale di qualcosa che si apre e oscura solo parte dello schermo utente. Questa nota è stata aggiunta per chiarire in base a un commento di @GMsoF sotto

+26

NO. Questo è fuorviante. Una finestra di dialogo mostrata non chiamerà onPause() poiché la finestra di dialogo usa il contesto dell'attività corrente, considera l'attività in tempo reale. – GMsoF

+4

@GMsoF Sembra che quando ho detto il dialogo, pensavate che intendevo 'Dialog', come nella classe di Android. Ciò che stavo ottenendo, tuttavia, è qualcosa che oscura parzialmente la prima attività per illustrare l'idea che tutte le nuove attività non devono coprire completamente la precedente. –

9

Essere in primo piano significa che l'attività ha il focus di input. Ad esempio, un'attività può essere visibile ma parzialmente oscurata da una finestra di dialogo focalizzata. In tal caso, verrà chiamato onPause(), ma non onStop(). Quando la finestra di dialogo scompare, verrà chiamato il metodo onResume() dell'attività (ma non onStart()).

+3

La finestra di dialogo potrebbe essere fuorviante. Se viene visualizzata una finestra di avviso dal thread dell'interfaccia utente principale di questa attività, onPause() non verrà chiamato in questo caso. Solo se questa finestra di dialogo viene visualizzata da un'altra attività o altra app. – Sam003

+1

@Zhisheng - Sono d'accordo con il tuo commento. Stavo solo parafrasando [l'argomento guida Activites] (http://developer.android.com/guide/components/activities.html#ImplementingLifecycleCallbacks): _ "' onPause() 'viene chiamato quando il dispositivo va in stop o quando compare la finestra di dialogo "_. Come [questo thread] (http://stackoverflow.com/a/7384782/535871) rende chiaro, tuttavia, una finestra di dialogo non significa necessariamente che un'attività è in pausa (anche se sarebbe per, per esempio, una [attività mostrata come una finestra di dialogo] (http://developer.android.com/guide/topics/ui/dialogs.html#ActivityAsDialog)). –

83

No, se alcune attività sono in primo piano, ciò non significa necessariamente che l'altra attività sia completamente invisibile. Si consideri il seguente caso:

Activity with the theme Theme.Dialog

Qui vediamo entrambe le attività allo stesso tempo. La prima attività con i campi è oscurata da un'altra attività e l'utente non può più interagire con esso. Tuttavia, è ancora visibile con tutte le conseguenze che ne derivano.

Ciò lascia una domanda che l'attività è considerata completamente opaca e che copre l'intero schermo e che non lo è. Questa decisione è basata sulla finestra contenente l'attività. Se la finestra ha una bandiera windowIsFloating o windowIsTranslucent, allora si considera che l'attività non rende invisibili le cose sottostanti, altrimenti lo fa e causerà la chiamata di onStop(). Il codice in questione può essere trovato in com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
     com.android.internal.R.styleable.Window_windowIsFloating, false) 
     && !ent.array.getBoolean(
     com.android.internal.R.styleable.Window_windowIsTranslucent, false); 
+9

+1 per una grande spiegazione, concentrandosi sulla visibilità parziale e totale (in). Sarebbe interessante conoscere la percentuale di soglia dello schermo che consente a Android di decidere tra 'onPause()' e 'onStop()'. È al 100%? Se è visibile solo un pixel dell'attività precedente, è ancora 'onPause()'? – ateiob

+3

@ateiob Non è detto da nessuna parte, ma penso di si. Tuttavia, di solito è ovvio perché la maggior parte delle attività che non riempiono l'intero schermo usano semplicemente uno degli stili forniti dal sistema per le finestre di dialogo. – Malcolm

+1

Strano, ma nella mia applicazione 'onPause()' non viene chiamato affatto quando viene visualizzata una finestra di dialogo. 'onPause()' viene chiamato solo quando premo il pulsante ** home **. Com'è possibile? – ateiob

-3

Yeap, cerco di capire e posso spiegare questo qui sotto:

Ci sono 2 attività: ActivityA & ActivityB

public class ActivityA extends Activity implements OnClickListener { 

// button 
private Button mBtnChangeActivity; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 
    initialize(); 
    setEvent(); 
} 

private void initialize() { 
    Log.i("Activity A", "Initialize()"); 
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity); 
} 

private void setEvent() { 
    Log.i("Activity A", "setEvent()"); 
    mBtnChangeActivity.setOnClickListener(this); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.i("Activity A", "onStart"); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i("Activity A", "onResume"); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    Log.i("Activity A", "onPause"); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    Log.i("Activity A", "onStop"); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    Log.i("Activity A", "onDestroy"); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn_change_activity: 
     Intent activityB = new Intent(this, ActivityB.class); 
     startActivity(activityB); 
     break; 
    default: 
     break; 
    } 
} 

Ecco Attività B. Segui il mio commento nel codice

public class ActivityB extends Activity implements OnClickListener { 

// button 
private Button mBtnChangeActivity; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 
    initialize(); 
    setEvent(); 
    // if call finish() here, activityA will don't stop, just pause 
    // Activity A will call onStop() when Activity B call onStart() method 
    finish(); 
} 

private void initialize() { 
    Log.i("Activity B", "Initialize()"); 
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity); 
} 

private void setEvent() { 
    Log.i("Activity B", "setEvent()"); 
    mBtnChangeActivity.setOnClickListener(this); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.i("Activity B", "onStart"); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i("Activity B", "onResume"); 
} 


@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn_change_activity: 
     finish(); 
     break; 
    default: 
     break; 
    } 
} 
} 

Spero che questo sia chiaramente

+0

sempre, prova a spiegare che ha un senso –

0

Il seguente diagramma mostra i percorsi di stato importanti di un'attività. I rettangoli quadrati rappresentano i metodi di callback che è possibile implementare per eseguire operazioni quando l'attività si sposta tra gli stati. Gli ovali colorati sono gli stati principali in cui può svolgersi l'attività.

0

ogni volta che una nuova ATTIVITÀ inizia l'attività viene chiamata in modo provocatorio in qualsiasi circostanza.

realtà questo sarà due circostanze:

1- una parte di attività precedente è visibile o la nuova attività è trasparente: si chiamerà solo onPuase.

2- precedente attività è completamente ricoperto da una nuova attività: sia onPuase e onStop saranno chiamati

---- Buono a affermare alcune note:

NOTA 1: se una finestra inizia in cima verrà chiamata un'attività NESSUNA onPuase o onStop.

NOTA 2: se è un'attività il cui tema è impostato su una finestra di dialogo, il comportamento sarà simile a un'attività normale.

NOTA 3: apparentemente una finestra di dialogo del sistema come la finestra di dialogo delle autorizzazioni da marshmallow causerà onPuase.