一、Android Activity 的生命周期
1. 见官方示意图片如下:
2. 注意三条线
- onCreat() -> onStart() -> onResume() -> Activity Running -> onPause() -> onStop() -> onDestroy()
- onPause() -> new Activity is running foreground -> onResume()
- onStop() -> new Activity is running foreground -> onRestart() -> onStart() -> onResume()
B和C的区别在于,新的Activity是否会覆盖创建它的Activity。
3. 当系统的内存极低的时候,处于onPause()状态的的Activity会被回收内存;但是处于onStop()状态的Activity随时都可能被回收。
二、 代码示例
例子很简单,调用onXXX函数的时候,跳一个Toast出来,再打个Log~
1. MainActivity.java
package com.example.testandroidlifetime;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText nameEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameEditText = (EditText) findViewById(R.id.et_name);
Toast.makeText(this, "onCreate() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onCreate() called");
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this, "onStart() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onStart() called");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Toast.makeText(this, "onRestoreInstanceState() called",
Toast.LENGTH_LONG).show();
Log.v("Halfish", "onRestoreInstanceState() called");
String name = savedInstanceState.getString("name");
nameEditText.setText(name);
}
@Override
protected void onRestart() {
super.onRestart();
Toast.makeText(this, "onRestart() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onRestart() called");
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "onResume() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onResume() called");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Toast.makeText(this, "onSaveInstanceState() called", Toast.LENGTH_LONG)
.show();
Log.v("Halfish", "onSaveInstanceState() called");
outState.putString("name", nameEditText.getText().toString());
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "onPause() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onPause() called");
}
@Override
protected void onStop() {
super.onStop();
Toast.makeText(this, "onStop() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onStop() called");
}
@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(this, "onDestroy() called", Toast.LENGTH_LONG).show();
Log.v("Halfish", "onDestroy() called");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
2. activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
tools:context="com.example.testandroidlifetime.MainActivity" >
<LinearLayout
android:id="@+id/lly_name"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="name" />
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:ems="10"
android:hint="@string/app_name" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/lly_name"
android:gravity="center" >
<TextView
android:id="@+id/tv_password"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="pass" />
<EditText
android:id="@+id/et_password"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:ems="10"
android:inputType="textPassword" />
</LinearLayout>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/linearLayout1"
android:layout_marginLeft="41dp"
android:layout_marginTop="72dp"
android:text="Button" />
</RelativeLayout>