Activity生命周期——Mars Android开发视频之第二季第一集(重)

别等时光非礼了梦想. 提交于 2019-11-30 11:00:17

1· Activity的生命周期(一)

1.1 如何定义多个Activity

1 - 新建一个类,继承Activity

package com.example.activiylife;

import android.app.Activity;

public class SecondActivity extends Activity{

}

2- 重写Activity中的onCreate方法

	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方法中调用布局文件


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

5- 在主配置文件(AndroidManifest.xml)中注册该Activity

在<application>中添加一对<activity>子标签;

android:name后面写新增的activit的完整类名

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

至此,就完成、增加了一个全新的activity。

如果想要看见它的话,我们还需要改一个地方:

在主配置文件中,为这个新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,5、4、3、2、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-松开油门(刹车)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!