Activity lifecycle:step three(生命週期方法詳解)

這裏通過使用一個簡單的例子來解釋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)被創建並顯示如下圖所示:

    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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章