安卓活动的生命周期

安卓每个活动在其生命周期中最多可能有四种状态:

  1. 运行状态:
            当一个活 位于返回 栈顶时 这时 于运行状 态。
  2. 暂停状态:
            当一个活 不再 栈顶 位置,但仍然可 见时 这时 入了 停状 。你可能会 觉得既然活动 不在 栈顶 了, 会可 呢? 是因 并不是 一个活 都会占 整个 屏幕的,比如对话 框形式的活 只会占用屏幕中 间的部分区域。 ​​​​​
  3. 停止状态:
            当一个活 不再 栈顶 位置,并且完全不可 候,就 入了停止状 。系 仍然会为这种活 保存相 的状 和成 员变 量,但是 并不是完全可靠的,当其他地方需要内存时, 于停止状 的活 有可能会被系 回收。 
  4. 销毁状态:
             当一个活 从返回 中移除后就 成了 销毁 。系 会最 向于回收 这种 的活动,从而保 手机的内存充足。 

 Activity中定7个回方法,覆盖了活生命周期的一个环节:

  • onCreate() 个活中我都会重写个方法,它会在活第一次被建的用。个方法中完成活的初始化操作,比如布局、定事件等。
  • onStart() 个方法在活由不可见变为用。
  • onResume() 。这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈顶,并且于运行状
  • onPause() 。这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在个方法中将一些消耗CPU放掉,以及保存一些关键数据,但个方法的行速度一定要快,不然会影响到新的栈顶的使用。
  • onStop() 。这个方法在活动完全不可见的时候调用。它和onPause() 方法的主要区别在于,如果启的新活是一个对话框式的活,那onPause() 方法会得到行,onStop() 方法并不会执行。
  • onDestroy() 个方法在活销毁之前用,之后活的状变为销毁态。
  • onRestart() 个方法在活由停止状态变为运行状之前用,也就是活被重新了。
以上 7 个方法中除了 onRestart() 方法,其他都是两两相 的,从而又可以将活 3 生存期。
  • 完整生存期 。活onCreate() 方法和onDestroy() 方法之经历的,就是完整生存期。一般情况下,一个活会在onCreate() 方法中完成各初始化操作,而onDestroy() 方法中完成放内存的操作。
  • 生存期 。活onStart() 方法和onStop() 方法之经历的,就是可生存期。在可生存期内,活动对于用户总是可的,即便有可能无法和用户进行交互。我可以通过这两个方法,合理地管理那些源。比如在onStart() 方法中对资行加,而在onStop() 方法中对资放,从而保证处于停止状的活不会占用多内存。
  • 前台生存期 。活onResume() 方法和onPause() 方法之经历的就是前台生存期。在前台生存期内,活动总于运行状的,此的活是可以和用户进行交互的,看到和接触最多的也就是个状下的活

 

实践项目:

主活动布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/start_normal_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start NormalActivity"
        android:onClick="startNormalActivity"/>

    <Button
        android:id="@+id/start_dialog_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start DialogActivity"
        android:onClick="startDialogActivity"/>
</LinearLayout>

 子活动NormalActivity布局:

<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:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a normal activity" />
</LinearLayout>

子活动DialogActivity布局:

<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:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a dialog activity" />
</LinearLayout>

AndroidManifest.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.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=".DialogActivity"
            android:theme="@style/Theme.AppCompat.Dialog">
        </activity>
        <activity android:name=".NormalActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

两个子活动的代码不需要再重新编写,用自动生成的即可:

public class NormalActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.normal_activity);
    }
}
public class DialogActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_activity);
    }
}

主活动代码:

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "+++++++++++++++++++++++++");
        Log.d(TAG,"onCreate:这个方法中完成活动的初始化操作");
        setContentView(R.layout.activity_main);

    }

    public void startNormalActivity(View v){
        Intent intent = new Intent(MainActivity.this,NormalActivity.class);
        startActivity(intent);
    }

    public void startDialogActivity(View v){
        Intent intent = new Intent(MainActivity.this,DialogActivity.class);
        startActivity(intent);
    }

    //onStart() 活动由不可见变为可见
    @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: 这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新" +
                "启动了。");
    }
}

首次运行之后虚拟机界面:

此时我们用筛选器查看TAG即MainActivity标签的内容为:
 

可以看到,当MainActivity第一次被会依次onCreate() onStart() 和 onResume() 方法。 

当我们点击第一个按钮startNormalActivity后,虚拟机的界面为:

此时再查看日志发现又执行了onPause() onStop() 方法

 由于NormalActivityMainActivity完全遮住,因此onPause() onStop() 方法都会得到执行。

然后我们再按下back键返回MainActivity,此时我们再查看日志发现onRestart() 方法会得到行,之后又会依次执onStart() onResume() 方法。

接着再点第二个按钮startDialogActivity,此时虚拟机的界面为:

这时活动就处于暂停状态,可以通过打印的日志看到,只有onPause() 方法得到了行,onStop() 方法并没有行,是因为DialogActivity并没有完全遮MainActivity,此MainActivity只是入了停状,并没有进入停止状态

再按一下back键,此时只有onResume() 方法会得到行:

再按一下back键退出程序,程序会依次会onPause() onStop() onDestroy() 方法,最终销毁MainActivity

这就是一个完整的生命周期。

                                                                                         ——本文摘自《第一行代码》(第2版)为了方便自己理解稍微做了一些改动。如果想看原文,请看《第一行代码》(第2版)P88——P98

发布了79 篇原创文章 · 获赞 101 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41575507/article/details/105477836