活动的生命周期
返回栈:Android是使用Task来管理活动的,一个任务就是一组存放在栈里的的活动的集合,这个栈被称之为返回栈。栈是一种先进先出的数据结构,在默认情况下当启动一个新的活动,它会在返回栈中入栈,处于栈顶的位置,当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
活动状态:活动在其生命周期中最多可能会有4种状态。
- 运行状态,当活动位于返回栈顶时,活动就处于运行状态。(注意:系统最不愿意回收处于运行状态的活动)
- 暂停状态,活动不再处于栈顶位置,但任然可见,这时活动处于运行状态。(注意:并不是所有的活动都占满整个屏幕的,比如对话框形式的活动只会占用屏幕中间。系统也不愿意去回收这种活动,只有在内存极低的情况下,系统才会考虑回收这种活动)
- 停止状态,活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。(注意:系统任会保存相应的状态和成员变量,但这并不完全可靠,当其他地方需要内存时可能会被系统回收)
- 销毁状态,活动从返回栈中移除后就变成了销毁状态(注意:系统会倾向于回收这种活动,从而保持手机内存充足)
活动生存期:Activity类中定义了7个回调方法,这个些方法存在于活动生命周期的每一个环节。
- onCreate()在活动第一次创建的时候调用,这个方法一般用于完成活动的初始化操作,比如加载布局、绑定事件等。
- onStart()在活动由不可见变为可见的时候调用。
- onResume()在活动准备好和用户进行交互的时候调用。此时活动一定位于返回栈的栈顶,并处于运行状态。
- onPause()在系统准备去启动huo或者恢复另一个活动的时候调用。
- onStop在活动完全不可见的时候调用,它和onPause()的主要区别在于,如果启动的活动是一个对话框式的活动,那么onPause()会得到执行,而onStop()方法并不会执行。
- onDestroy()在活动销毁之前调用,之后活动的状态将变为销毁状态。
- onRestart()在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
案例体验:
新建一个android项目,新建三个Activity分别命名为:MainActivity(布局名为main_layout)、NormalActivity(布局名为normal_layout)、DialogActivity(布局名为dialog_layout)。
NormalActivity中内容为:
package com.example.tenderness.activitylifecycletest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class NormalActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.normal_layout);
}
}
normal_layout.xml中内容为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a normal activity" />
</LinearLayout>
DialogActivity中内容为:
package com.example.tenderness.activitylifecycletest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class DialogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);
}
}
dialog_layout.xml中内容为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a dialog activity" />
</LinearLayout>
MainActivity中内容为:
package com.example.tenderness.activitylifecycletest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
public static final String TAG ="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Log.d(TAG,"onCreate----正在创建活动");
Button startNormalActivity=(Button)findViewById(R.id.satrt_normal_activity);
startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
Button startDialogActivity=(Button)findViewById(R.id.start_dialog_activity);
startDialogActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart----动由不可见变为可见");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume----活动准备好和用户进行交互");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause----系统准备去启动huo或者恢复另一个活动");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop----活动完全不可见");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy----活动销毁之前");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"onRestart----活动由停止状态变为运行状态之前");
}
}
main_layout.xml内容为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/satrt_normal_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start NormalActivity" />
<Button
android:id="@+id/start_dialog_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start DialogActivity"/>
</LinearLayout>
在AndroidManifest.xml中设置DialogActivity为对话框活动:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tenderness.activitylifecycletest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity"
android:theme="@android:style/Theme.Dialog">
</activity>
</application>
</manifest>