Aggiunta di alcune ulteriori informazioni in cima alla risposta molto valutata (aggiunta la sezione aggiuntiva di KILLABLE e il prossimo set di metodi, che verranno chiamati nel ciclo di vita):
Fonte: developer.android.com
Nota la colonna " Killable " nella tabella sopra - per quei metodi che sono contrassegnati come killable, dopo che quel metodo restituisce il processo che ospita l'attività può essere ucciso dal sistema in qualsiasi momento senza che venga eseguita un'altra riga del suo codice.
Per questo motivo, è necessario utilizzare il onPause()
metodo per scrivere tutti i dati persistenti (come le modifiche dell'utente) nella memoria. Inoltre, il metodo onSaveInstanceState(Bundle)
viene chiamato prima di posizionare l'attività in tale stato di background, consentendo di salvare qualsiasi dato di istanza dinamica nella propria attività nel dato Bundle
, per essere successivamente ricevuto onCreate(Bundle)
se l'attività deve essere ricreata.
Si noti che è importante salvare i dati persistenti onPause()
anziché onSaveInstanceState(Bundle)
perché quest'ultimo non fa parte dei callback del ciclo di vita, quindi non verrà chiamato in ogni situazione come descritto nella sua documentazione.
Vorrei aggiungere qualche altro metodo. Questi non sono elencati come metodi del ciclo di vita, ma saranno chiamati durante il ciclo di vita a seconda di alcune condizioni. A seconda delle esigenze, potrebbe essere necessario implementare questi metodi nell'applicazione per una corretta gestione dello stato.
onPostCreate(Bundle savedInstanceState)
Chiamato quando l'avvio dell'attività è completo (dopo onStart()
e onRestoreInstanceState(Bundle)
sono stati chiamati).
onPostResume()
Chiamato quando il ripristino dell'attività è completo (dopo che onResume()
è stato chiamato).
onSaveInstanceState(Bundle outState)
Chiamato per recuperare lo stato per istanza da un'attività prima di essere ucciso in modo che lo stato possa essere ripristinato in onCreate(Bundle)
o onRestoreInstanceState(Bundle)
(il pacchetto popolato da questo metodo verrà passato a entrambi).
onRestoreInstanceState(Bundle savedInstanceState)
Questo metodo viene chiamato dopo che onStart()
l'inizializzazione dell'attività da uno stato precedentemente salvato, fornita qui in savedInstanceState
.
Il mio codice dell'applicazione usando tutti questi metodi:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText txtUserName;
private EditText txtPassword;
Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Ravi","Main OnCreate");
txtUserName=(EditText) findViewById(R.id.username);
txtPassword=(EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("Ravi", "Login processing initiated");
Intent intent = new Intent(this,LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("userName",txtUserName.getText().toString());
bundle.putString("password",txtPassword.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,1);
// IntentFilter
}
public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
Log.d("Ravi back result:", "start");
String result = resIntent.getStringExtra("result");
Log.d("Ravi back result:", result);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
Intent sendIntent = new Intent();
//sendIntent.setPackage("com.whatsapp");
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Ravi","Main Start");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Ravi","Main ReStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d("Ravi","Main Pause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("Ravi","Main Resume");
}
@Override
protected void onStop() {
super.onStop();
Log.d("Ravi","Main Stop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Ravi","Main OnDestroy");
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
Log.d("Ravi","Main onPostCreate");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("Ravi","Main PostResume");
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
Attività di accesso:
public class LoginActivity extends AppCompatActivity {
private TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
txtView = (TextView) findViewById(R.id.Result);
Log.d("Ravi","Login OnCreate");
Bundle bundle = getIntent().getExtras();
txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
//Intent intent = new Intent(this,MainActivity.class);
Intent intent = new Intent();
intent.putExtra("result","Success");
setResult(1,intent);
// finish();
}
}
uscita: (prima della pausa)
D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
uscita: (dopo il ripristino dalla pausa)
D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
Si noti che onPostResume()
viene invocato anche se non è citato come metodo del ciclo di vita.