Android- 系统开发 _ 四大组件篇 ---- 探讨 -Activity- 的生命周期
以上?7?个方法中除了 onRestart() 方法,其他都是两两对应的,从而可以将活动分为?3?种生存期。
完整生存期:活动在 onCreate() 方法和 onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法种完成释放内存的操作。
可见生存期():活动在 onStart() 方法和 onStop() 方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart() 方法中对资源进行加载,而在 onStop() 方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
前台生存期:活动在 onResume() 方法和 onPause() 方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我们平时看到和接触最多的就是这个状态下的活动。
我们看下官方给出的 Activity 生命周期的示意图:
实战演练
Code
我们先定义一个:NormalActivity
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout 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=".NormalActivity">
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="This is a normal activity" /></android.support.constraint.ConstraintLayout>
再定义一个:DialogActivity
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout 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=".DialogActivity">
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="This is a dialog activity" /></android.support.constraint.ConstraintLayout>
为了让 DialogActivity 使用对话框式主题,我们在 AndroidManifest.xml 中做如下设置:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.marco.activitylifecycletest">
<applicationandroid: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="@style/Theme.AppCompat.Dialog"> // Look here</activity></application>
</manifest>
接下来修改 activity_main.xml,重新定制主活动的布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<Buttonandroid:id="@+id/start_normal_activity"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Start NormalActivity" />
<Buttonandroid:id="@+id/start_dialog_activity"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Start DialogActivity" />
</LinearLayout>
修改 MainActivity :
package com.example.marco.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";private Button startNormalActivity = null;private Button startDialogActivity = null;
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startNormalActivity = findViewById(R.id.start_normal_activity);startDialogActivity = findViewById(R.id.start_dialog_activity);startNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, NormalActivity.class);startActivity(intent);}});startDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, DialogActivity.class);startActivity(intent);}});}
@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart");}
@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume");}
@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause");}
@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop");}
@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");}
@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, "onRestart");}}
Result
(1)当 MainActivity 第一次被创建时,如下方法被执行:
2018-10-18 04:31:29.071 2526-2526/? D/MainActivity: onCreate2018-10-18 04:31:29.077 2526-2526/? D/MainActivity: onStart2018-10-18 04:31:29.083 2526-2526/? D/MainActivity: onResume
(2)点击 Start NormalActivity 按钮:
2018-10-18 04:33:02.159 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onPause2018-10-18 04:33:02.745 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onStop
因为 NormalActivity 已经把 MainActivity 完全遮挡住,因此 onPause() 和 onStop() 方法都会得到执行。
(3)点击 Back 键返回 MainActivity:
2018-10-18 04:35:00.010 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onRestart2018-10-18 04:35:00.012 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onStart2018-10-18 04:35:00.014 2526-2526/com.example.marco.activitylifecycletest D/MainActivity: onResume
由于之前 MainActivity 已经进入了停止状态,所以 onRestart() 方法会得到执行,之后又会执行 onStart() 和 onResume() 方法。注意,此时 onCreate() 方法不会执行,因为 MainActivity 并没有重新创建。
(4)点击 Start DialogActivity 按钮:
2018-10-18?04:43:38.006?3555-3555/com.example
.marco.activitylifecycletest D/MainActivity:?onPause
通过 Log 可以看到,只有 onPause() 方法得到了执行,onStop() 方法并没有执行,这是因为 DialogActivity 并没有完全遮挡住 MainActivity,此时 MainActivity 只是进入了暂停状态,并没有进入停止状态。
评论