Android开发艺术探索笔记|Activity的生命周期和启动模式

1,典型情况下的生命周期分析:

在这里插入图片描述
onCreate():Activity被创建的时候调用;

onStart():执行完这个方法,Activity已经可见,但是是后台可见,没有出现在前台,不可交互。

onResume():执行完Activity可见,在前台出现,可交互。

onRestart():Activity重新被启动,当从不可见到可见的时候被调用。

onPause():表示Activity正在停止,执行完Activity还可见,但不在前台,不可交互。

onStop():表示Activity即将停止,执行完Activity不可见。

onDestroy():表示Activity即将被销毁,执行完后就要重新创建Activity,也就是重新调用onCreate()。

注意

  • 当按键back的时候也就是调用finish()的时候,执行onPause(),onStop(),onDestroy();

  • 当按键home的时候,也就是退出后台的时候,执行onPause(),onStop();再进来的时候执行onRestart(),onStart(),onRsume();

  • 当打开新的Activiy,但是当前Activity没有完全不可见的时候,只调用onPause(),而不会调用onStop();

  • 当打开新的Activity的时候,当前Activity会先调用onPause(),执行完之后新的Activity才调用onCreate()。所以不能在onPause()中执行太耗时的操作,以免影响新Activity的打开。

  • onCreate()和onDestroy()成对出现,onStart()和onStop()是成对出现,OnResume()和onPause()是承兑出现,那么onStart(),onStop()和OnResume(),onPause()有什么区别呢?onStart(),onStop()主要侧重可见不可见的问题,OnResume(),onPause()主要侧重是否在前台,能不能交互的问题。

2,异常情况下的生命周期分析:

1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
如当屏幕旋转的时候,系统的资源配置发生改变(设置横屏手机和竖屏手机不同的图片的时候,屏幕旋转,图片要发生改变,称为资源改变),这时候就会导致Activity被销毁,然后重新创建新的适配的Activity。

过程:首先当前的Activity会执行onPause(),onStop(),onDestroy()。注意在执行onStop()之前会执行一个方法onSaveInstanceState()用于 保存当前Activity的状态,如光标位置或者是浏览位置等。接着就是创建新的Activity,执行onCreste(),onStart(),然后就会执行onRestoreInstanceState()方法,用于将onSaveInstanceState方法保存的Bundle对象作为参数传递给onRestoreInstanceState()或者是onCreate();Bundle对象中保存着之前Activity的状态。

防止系统配置发生改变的时候重建Activity
当系统在如下情况的时候就会销毁Activity重新创建,但是当在Menifest的Activity中指定configChanges属性就可以防止Activity的重建。如想要防止手机在屏幕旋转的时候防止Activity重建,可以在Menifest中的对应Activity中添加android:configChanges=“orientation”可以用“|”指定多个值。
在这里插入图片描述
2,资源内存不足导致低优先级的Activity被杀死;
Activity按照优先级从高到低可分为三种:
1,前台Activity,正在和用户交互的Activity>2,可见非前台Activity,可见不可交互,如被弹出框挡住部分的Activity>3,后台Activity,执行了onStop的Activity。

3,Activity的启动模式LaunchMode

1,standard标准模式: 每启动一个Activity都会创建实例,调用onCreate(),onStart(),onResume();创建的Activity运行在启动他的Activity所在的任务栈中。

2,singleTop栈顶复用模式: 如果新的Activity已经在任务栈的栈顶,那么该Activity不会被重建,如果不在栈顶就会重建。

3,singleTask栈内复用模式: 该模式可以指定Activity运行在哪个任务栈中,可以通过在Menifest中对应的Activity指定taskAffinity来指定任务栈。不指定默认是包名的任务栈。这种模式的Activity首先会寻找是否具有指定的任务栈,如果没有就创建一个任务栈并把Activity压栈。如果已经有了这个任务栈再判断是否具有Activity实例,如果没有创建实例并压栈,如果有了这个实例,这个实例前的Activity全部出栈,该实例调到栈顶。

4,singleInstance单实例模式: 具有singleTask的特性,并且每个Activity独自运行在新的任务栈。

为Activity指定启动模式
有两种方式:
1,在Menifest中对应的Activity中android:launchMode=“singleTask”
2,用intent设置标记位:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

猜你喜欢

转载自blog.csdn.net/qq_44280408/article/details/105433418