Dodanie kilku dodatkowych informacji do wysoko ocenianej odpowiedzi (Dodano dodatkową sekcję KILLABLE i kolejny zestaw metod, które zostaną wywołane w cyklu życia):
Źródło: developer.android.com
Uwaga „ Możliwy do zabicia kolumnę ” w powyższej tabeli - dla metod oznaczonych jako możliwe do wywołania, po zwróceniu tej metody proces hostujący działanie może zostać zabity przez system w dowolnym momencie bez wykonania kolejnego wiersza kodu.
Z tego powodu należy użyć tej onPause()
metody do zapisania wszelkich trwałych danych (takich jak zmiany wprowadzone przez użytkownika) do pamięci. Ponadto metoda onSaveInstanceState(Bundle)
jest wywoływana przed umieszczeniem działania w takim stanie tła, umożliwiając zapisanie dowolnego stanu instancji dynamicznej w danym działaniu do podanego Bundle
, który można później odebrać, onCreate(Bundle)
jeśli działanie musi zostać odtworzone.
Należy pamiętać, że ważne jest zapisywanie trwałych danych onPause()
zamiast, onSaveInstanceState(Bundle)
ponieważ nie są one częścią wywołań zwrotnych cyklu życia, więc nie będą wywoływane w każdej sytuacji, jak opisano w jego dokumentacji.
Chciałbym dodać jeszcze kilka metod. Nie są one wymienione jako metody cyklu życia, ale będą wywoływane podczas cyklu życia, w zależności od niektórych warunków. W zależności od wymagań może być konieczne zaimplementowanie tych metod w aplikacji w celu prawidłowej obsługi stanu.
onPostCreate(Bundle savedInstanceState)
Wywoływany, gdy rozruch aktywności jest zakończony (po onStart()
i onRestoreInstanceState(Bundle)
został wywołany).
onPostResume()
Wywoływany, gdy wznawianie aktywności jest zakończone (po onResume()
wywołaniu).
onSaveInstanceState(Bundle outState)
Wywoływany w celu pobrania stanu instancji z działania przed zabiciem, aby można go było przywrócić w onCreate(Bundle)
lub onRestoreInstanceState(Bundle)
(pakiet wypełniony tą metodą zostanie przekazany do obu).
onRestoreInstanceState(Bundle savedInstanceState)
Ta metoda jest wywoływana po onStart()
ponownym zainicjowaniu działania z wcześniej zapisanego stanu, podanego tutaj w savedInstanceState
.
Mój kod aplikacji przy użyciu wszystkich tych metod:
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);
}
}
Aktywność logowania:
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();
}
}
wyjście: (Przed pauzą)
D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
wyjście: (Po wznowieniu z pauzy)
D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
Zauważ, że onPostResume()
jest wywoływany, chociaż nie jest cytowany jako metoda cyklu życia.