-正文:
Android系统中是通过Activity栈的方式来管理Activity的,而Activity自身则是通过生命周期的方法来管理的自己的创建与销毁。
Acitivity本质上有四种状态:
Running(运行):
Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。
Paused(暂停):
当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还存在,只有在系统内存紧张的情况下,才有可能被系统回收掉。
Stopped(停止):
当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量。
Killed(销毁):
当Activity被系统回收掉时,Activity就处于Killed状态。
onCreate():
该方法表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中可以做一些初始化的工作(加载布局资源、初始化Activity所需要的数据等),耗时的工作在异步线程上完成。
onStart():
该方法表示Activity正在被启动,并且即将开始。此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。这个时候要注意它与onResume的区别:两者都表示Activity可见,但是onStart时用户还看不到界面,onResume可以看到界面。
onRestart():
该方法表示Activity正在重新启动。当前Activity从不可见重新变为可见的状态时,onRestart就会被调用。这种情形一般是由于用户的行为所导致的,比如用户按下Home键切换到桌面或者打开了一个新的Activity时,当前Activity会被暂停(onPause和onStop被执行),接着又回到当前Activity页面时,onRestart方法就会被回调。
onResume():
该方法表示Activity已经创建完成,并且可以开始活动了,这个时候用户已经可以看到界面了,并且即将与用户交互(完成该周期之后便可以响应用户的交互事件了)。
onPause():
该方法表示Activity正在暂停,一般情况下onStop接着就会被调用。在特殊情况下,如果这个时候用户快速地再回到当前的Activity,那么onResume会被调用。在onPause方法中我们可以做一些存储数据、停止动画的工作或者资源回收的操作,但是不能太耗时,因为这可能会影响到新Activity的显示。onPause必须执行完,新的Activity的onResume才会执行。
onStop():
该方法一般在onPause方法执行完成直接执行,表示Activity即将停止,此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。
onDestroy():
该方法表示Activity即将被销毁,也是生命周期最后一个执行的方法,我们可以做一些回收工作和最终的资源释放(如Service、BroadReceiver、Map等)。
MainActivity.java: 首先新建一个项目,然后新建两个activity文件
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
//将临时数据进行保存
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
String tempData = "something you just typed";
outState.putString("data_key", tempData);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//将数据取出
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
Button startNormalActivity = findViewById(R.id.start_normal_activity);
Button startDialogActivity = findViewById(R.id.start_dialog_activity);
startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NormalActivity.class);
startActivity(intent);
}
});
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");
}
@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");
}
}
activity_main.xml: 设置两个按钮,一个是用于启动NormalActivity,一个是用于启动DialogActivity.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.lnjr.activityliftcycletest.MainActivity">
<Button
android:id="@+id/start_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>
dialog布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lnjr.activityliftcycletest.DialogActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a dialog activity"/>
</LinearLayout>
normal布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lnjr.activityliftcycletest.NormalActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a normal activity"/>
</LinearLayout>