這裏通過使用一個簡單的例子來解釋activity的生命週期方法的使用。這個簡單的例子只包括兩個activity:MainActivity和SecondActivity,以此來實現activity之間的轉換。
下面給出這兩個activity的Java源文件:
MainActivity:
package com.weigenshang.activitydemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("MainActivity中調用onCreate()");
setContentView(R.layout.activity_main);
// 獲取代表button的對象
button = (Button)findViewById(R.id.myButton);
textView = (TextView)findViewById(R.id.mytextview);
textView.setText(R.string.textview1);
button.setText(R.string.button);
// 生成監聽器對象
ButtonListener buttonListener = new ButtonListener();
// 爲button綁定監聽器對象
button.setOnClickListener(buttonListener);
}
// 定義一個內部類,且實現接聽器接口
class ButtonListener implements View.OnClickListener{
// 實現該監聽器接口,需要重寫onClick()方法
@Override
public void onClick(View v) {
// 生成一個intent對象
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
MainActivity.this.startActivity(intent);
}
}
@Override
protected void onStart() {
super.onStart();
System.out.println("MainActivity中調用onStart()");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity中調用onResume()");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("MainActivity中調用onStop()");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("MainActivity中調用onPause()");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("MainActivity中調用onDestroy()");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("MainActivity中調用onResume()");
}
}
再給出SecondActivity的Java源文件:
package com.weigenshang.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends Activity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("SecondActivity中調用onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
textView = (TextView)findViewById(R.id.mytextview);
textView.setText(R.string.textView2);
}
protected void onStart(){
super.onStart();
System.out.println("SecondActivity中調用onStart()");
}
protected void onResume(){
super.onResume();
System.out.println("SecondActivity中調用onResume()");
}
protected void onPause(){
super.onPause();
System.out.println("SecondActivity中調用onPause()");
}
protected void onDestroy(){
super.onDestroy();
System.out.println("SecondActivity中調用onDestroy()");
}
protected void onRestart(){
super.onRestart();
System.out.println("SecondActivity中調用onRestart()");
}
protected void onStop(){
super.onStop();
System.out.println("SecondActivity中調用onStop()");
}
}
當啓動這個小的應用程序時,主activity(即MainActivity)被創建並顯示如下圖所示:
且在logcat(已經設置過濾器)可以看到這樣的輸出:
即在創建這個新的activity時,android操作系統先後調用了onCreate(),onStart(),onResume()方法。
onCreate()方法:在系統第一次創建一個activity時被調用。在這個方法內,可以設置該activity使用的佈局文件,也可以給控件綁定監聽器等等。在調用完該方法後,系統隨即迅速地調用onStart()方法。
onStart()方法:在activity即將被用戶可見時被調用,調用完該方法後,則activity對用戶可見。調用完該方法後,系統隨即迅速地調用onResume()方法。
onResume()方法:在activity即將可以和用戶進行交互時被調用,調用完後則activity獲得用戶焦點,可以和用戶進行交互。
注意:這三個方法是以中間時間間隔很短的方式依次被調用的即:被創建出來後馬上就可以被用戶可見,可見後馬上就可以和用戶進行交互。
- 當點擊MainActivity中的按鈕時,則啓動到下一個activity如圖所示:
並且logcat中可以看到這樣的輸出:
onPause()方法:當即將啓動另一個activity時被調用,也就意味着這個activity將要被暫停。在這個方法內應該將當前activity中的操作的數據保存起來,方便返回的時候讀取數據恢復原來的activity。有趣的是當手機自動鎖屏時,也會調用當前activity的onPause(),且隨後會調用onStop().因爲其當前activity不可見了。
然後是依次調用SecondActivity的onCreate(),onStart(),onResume()方法來啓動SecondActivity並使其獲得用戶焦點。
onStop()方法:當activity對用戶不可見時被調用。因爲SecondActivity已經完全覆蓋了MainActivity即MainActivity對用戶不再可見,所以調用MainActivity的onStop()方法,調用完該方法後activity就處於停止的狀態。
注意:啓動一個新的Activity時應該先onPause()原來的activity並保存其中的數據;要注意的是當新啓動的activity沒有完全覆蓋掉原來的activity時,比如彈出的是對話框時,這時上一個activity就不會調用onStop()方法
- 再次按返回按鈕返回到MainActivity時,這時logcat中的輸出的內容如圖所示:
返回到上一個activity,要先把當前的activity暫停即調用當前activity的onPause(),
再調用onRestart()重啓已經存在的處於stop狀態的MainActivity,再依次調用onStart(),onResume()使MainActivity獲得用戶焦點,
此時SecondActivity已經被完全覆蓋,則調用其onStop(),然後就調用onDestroy()銷燬SecondActivity,以節約內存空間。當再次啓動SecondActivity時,還需要再次調用onCreate()。
注意:經常是在一個activity獲得用戶焦點之後就會調用上一個activity的onStop(),因爲上一個activity已經是不可見的了;從當前activity返回到上一個activity時,當前activity就會被銷燬,下次啓動時會重新建立
簡要的描述方法的使用:
啓動第一個activity:
- onCreate():創建第一個activity
- onStart():使activity可見
- onResume():獲得用戶焦點
啓動另一個activity:
- onPause():暫停當前activity並保存數據,
- onCreate():創建第二個activity
- onStart()
- onResume()
- onStop():因爲第一個activity已經被完全遮擋了,所以調用第一個activity的onStop()
返回到第一個activity:
- onPause():暫停第二個activity
- onRestart():重啓第一個activity
- onStart()
- onResume()
- onStop():第二個activity被完全遮擋
- onDestroy():銷燬第二個activity