写点什么

Android- 系统开发 _ 四大组件篇 ---- 探讨 -Activity- 的生命周期

用户头像
Android架构
关注
发布于: 刚刚

以上?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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


.marco.activitylifecycletest D/MainActivity:?onPause



通过 Log 可以看到,只有 onPause() 方法得到了执行,onStop() 方法并没有执行,这是因为 DialogActivity 并没有完全遮挡住 MainActivity,此时 MainActivity 只是进入了暂停状态,并没有进入停止状态。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-系统开发_四大组件篇----探讨-Activity-的生命周期