Activity生命週期——Mars Android開發視頻之第二季第一集(重)

1· Activity的生命週期(一)

1.1 如何定義多個Activity

1 - 新建一個類,繼承Activity前端

package com.example.activiylife;

import android.app.Activity;

public class SecondActivity extends Activity{

}

2- 重寫Activity中的onCreate方法android

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

3- 建立佈局文件:數據結構

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<TextView 
	    android:id="@+id/textView"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="textView"/>
    
</LinearLayout>

4- 在onCreate方法中調用佈局文件app

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);
	}

5- 在主配置文件(AndroidManifest.xml)中註冊該Activity函數

在<application>中添加一對<activity>子標籤;佈局

android:name後面寫新增的activit的完整類名this

<activity
            android:name="com.example.activiylife.SecondActivity"
            android:label="@string/app_name" >
        </activity>

至此,就完成、增長了一個全新的activity。code

若是想要看見它的話,咱們還須要改一個地方:xml

在主配置文件中,爲這個新activity增長這段內容:對象

<intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

有這段內容,這個activity就會被做爲默認activity,另外,咱們還應該在前一個使用它的地方,把它刪除了:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.activiylife.MainActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.example.activiylife.SecondActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

這時,啓動程序就會默認啓動新增的activity:

輸入圖片說明

1.2 啓動另外一個Activity的方法

1- 生成一個意圖對象(Intent)

Intent intent = new Intent();

2- 調用setClass方法設置要啓動的Activity

//參數爲Context類型對象,它是Activity的父類,全部Activity對象能夠向上轉型爲Context對象
//第一個參數是當前activity對象,第二個參數爲要啓動的activity.class
intent.setClass(Context packageContext, Class<?> cls)

3- 調用startActivity方法啓動Activity

startActivity(intent);

這樣就能實現啓動另外一個activity;

下面用一個例子來講明: 在第一個activity點擊按鈕啓動第二個activity。

第一個activity的按鈕監聽:

class ButtonListener implements OnClickListener {
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(MainActivity.this, SecondActivity.class);
			startActivity(intent);
		}
	}

同時將默認activity設置爲第一個activity:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.activiylife.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.activiylife.SecondActivity"
            android:label="SecondActivity" >
        </activity>
    </application>

啓動程序:

輸入圖片說明

點擊按鈕來到secondeactivity:

輸入圖片說明

1.3 Android當中的back stack(後退棧)

棧:一種先進後出的數據結構

輸入圖片說明

用在activity上面的意思就是:

第一個activity在棧的最底層; 第二個activity在棧的倒數第二層; ... 最新的activity在棧的最上面,顯示在手機屏幕上;

點擊返回的時候,是返回到前一個activity,五、四、三、二、1這樣一直返回到棧最底層的activity。

2· Activity的生命週期(二)

2.1 什麼是生命週期

Activity從建立到銷燬這就是一個生命週期,在這個過程當中的不一樣階段要作不一樣的事。 具體處於什麼階段,這個由系統來控制,但具體階段所作的事,能夠根據需求來實現。

2.2 Activity的生命週期函數

這些函數由系統自動調用; 何時調用是由系統決定的,但函數內容是咱們能夠根據需求來定製。

輸入圖片說明

2.3 生命週期函數的調用時機

爲了初步瞭解這些函數的調用時機,咱們經過一個例子來講明。

在這個例子中,咱們一共須要兩個activity,實現從界面1點擊按鈕能進入界面2。

同時在兩個activity中,都重寫這個7個函數,打印輸出語句。

第一個activity的按鈕監聽器:

class ButtonOnClickListener implements OnClickListener {
		public void onClick(View arg0) {
			Intent intent = new Intent();
			intent.setClass(MainActivity.this, SecondActivity.class);
			startActivity(intent);
		}
	}

除onCreate外,另外的6個方法,兩邊activity都要重寫: (記得在onCreate方法中 寫一行打印語句)

protected void onDestroy() {
		super.onDestroy();
		System.out.println("----onDestroy----");
	}

	protected void onPause() {
		super.onPause();
		System.out.println("----onPause----");
	}

	protected void onRestart() {
		super.onRestart();
		System.out.println("----onRestart----");
	}

	protected void onResume() {
		super.onResume();
		System.out.println("----onResume----");
	}

	protected void onStart() {
		super.onStart();
		System.out.println("----onStart----");
	}

	protected void onStop() {
		super.onStop();
		System.out.println("----onStop----");
	}

啓動APP,進入第一個activity:

執行的函數依次爲:

1- onCreate-- Activity對象第一次建立時執行(第一個activity第一次建立)

2- onStart-- 能夠看見Activity的時候執行(第一個activity可見)

3- onResume-- 當Activity能夠與用戶交互時調用(第一個activity可交互)

輸入圖片說明

接着咱們打開第二個activity:

函數執行順序:

1- onPause-- 即將啓動另一個activity時執行。(這裏要啓動第二個activity了,因此第一個activity執行了onPause方法)

2- onCreate-- activity對象第一次被建立時執行(第二個activity是第一次啓動,因此要執行onCreate)

3- onStart-- 當actvitiy可見時被執行 (第二個activity可見)

4- onResume-- 當activity能夠進行交互時執行 (第二個activity可交互)

5- onStop-- 當activity不可見時執行 (第一個activity不可見)

輸入圖片說明

接着咱們點擊返回:

執行順序:

1- onPause-- 即將啓動另一個activity時執行(要啓動第一個activity,因此第二個activity執行onPause)

2- onRestart-- 當一個Activity再次啓動以前執行(第一個activity在以前已經被啓動過了,因此這裏執行onRestart)

3- onStart-- activity可見時執行(第一個activity可見)

4- onResume-- activity可交互時執行(第一個activity可交互)

5- onStop-- activity不可見時執行(第二個activity不可見)

6- onDestroy-- 當前activity被銷燬以前執行(第二個activity被銷燬)

輸入圖片說明

以上,咱們就能夠了解到一個activity的生命週期是什麼樣的。

  • Activity-A第一次啓動時執行:onCreate\onStart\onResume

  • 啓動其餘Activity前,Activity-A會執行onPause

  • 在其餘Activity啓動好,同時看不見Activity-A的時候,Activity-A會執行onStop

  • 從新回到Activity-A的時候,Activity-A會執行:onRestart\onStart\onResume

  • 當關閉Activity-A的時候,Activity-A會執行:onStop/onDestroy.

3· Activity的生命週期(三)

3.1 Activity對象的狀態

狀態

  • Resumed : Activity對象處於運行狀態

  • Paused : 另外一個Activity位於前端,但本Activity還可見

  • Stopped : 另外一個Activity位於前端,徹底遮蔽本Activity

注意:

  • Activiy不會自動釋放佔用資源
  • 須要在onStop、onPause、onDestroy中寫代碼來釋放資源

3.2 成對的生命週期函數

Activity生命週期圖

輸入圖片說明

onCreate和onDestroy一對

onPause和onResume一對

onStop和onStart一對

onRestart暫時一我的。

3.3 一個無厘頭的比喻

onCreate-買車 onDestroy-報廢

onStart-點火啓動 onStop-熄火

onResume-踩油門前進 onPause-鬆開油門(剎車)

相關文章
相關標籤/搜索