Android | Activity
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Android Activity
Activity 概念
Activity
是一种包含用户界面、主要用于与用户进行交互的Android应用组件。一个应用程序可以包含零个或多个 Activity
。
Activity 生命周期
Activity
类中定义了7个回调方法覆盖了 Activity
生命周期的每一个环节。
onCreate()
: 创建这个方法在Avtivity
第一次创建时被调用在这个方法中完成像加载布局、绑定事件等Activity
的初始化操作。onStart()
: 开始这个方法在Activity
由不可见变为可见时调用此时Activity
尚未出现在前台不能进行交互。onResume()
: 活动这个方法在Activity
准备好和用户进行交互的时候调用。此时的Activity
一定位于返回栈的栈顶并且处于运行状态.onPause()
: 暂停这个方法在系统准备去启动或者恢复另一个Activity
的时候调用。此时Activity
仍然可见但无法交互。我们通常会在这个方法中将一些消耗CPU的资源释放掉以及保存一些关键数据但这个方法的执行速度一定要快不然会影响到新的栈顶Activity
的使用。onStop()
: 停止这个方法在Activity
完全不可见的时候调用。它和onPause()
方法的主要区别在于如果启动的新Activity
是一个对话框式的Activity
那么onPause()
方法会得到执行而onStop()
方法并不会执行。onDestroy()
: 销毁这个方法在Activity
被销毁之前调用之后Activity
的状态将变为销毁状态。onRestart()
: 重启这个方法在Activity
由停止状态变为运行状态之前调用也就是Activity
被重新启动了。
除了 onRestart
之外的六个方法均是两两相对按照这种形式可以将 Activity
划分为3种生存期。
- 完整生存期
Activity
在onCreate()
方法和onDestroy()
方法之间所经历的就是完整生存期。一般情况下一个Activity
会在onCreate()
方法中完成各种初始化操作而在onDestroy()
方法中完成释放内存的操作。 - 可见生存期
Activity
在onStart()
方法和onStop()
方法之间所经历的就是可见生存期。在可见生存期内Activity
对于用户总是可见的即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。 - 前台生存期
Activity
在onResume()
方法和onPause()
方法之间所经历的就是前台生存期。在前台生存期内Activity
总是处于运行状态此时的Activity
是可以和用户进行交互的我们平时看到和接触最多的就是这个状态下的Activity
。
常见的生命周期变化有以下几种其中Activity A是MainActivity。
- 当
Activity A
第一次被创建onCreate()
->onStart()
->onResume()
- 从
Activity A
跳转至Activity B
时Activity A
的变化onPause()
->onStop()
- 从
Activity B
返回Activity A
时Activity A
的变化onRestart()
->onStart()
->onResume()
- 在
Activity A
打开一没有遮挡全部界面的弹窗Activity A
的变化onPause()
- 将上述弹窗关闭
Activity A
的变化onResume()
- 在
Activity A
中按下BACK
按钮onPause()
->onStop()
->onDestroy()
- 在
Activity A
中按下HOME
按钮并从桌面再次返回Activity A
onPause()
->onStop()
->onRestart()
->onStart()
->onResume()
- 在
Activity A
中执行finish()
方法onDestroy()
当一个Activity进入了停止状态是有可能被系统回收就可能造成上一个页面的临时数据与状态丢失使用 onSaveInstanceState()
回调方法可以避免这种情况这个方法可以保证在 Activity
被回收之前一定会被调用。
正常情况下切换横竖屏后Activity
会被销毁并重新创建正常情况下会重新走一遍生命周期onPause()
-> onSaveInstanceState()
-> onStop()
-> onDestroy()
-> onCreate()
-> onStart()
-> onRestoreInstanceState()
-> onResume()
。也可以通过在 AndroidManifest
中配置 android:configChanges = "orientation | screenSize"
来避免重新走一遍生命周期配置后切屏只会执行 onConfigurationChanged()
方法。
Activity 启动模式
Android中的 Activity
是可以层叠的。我们每启动一个新的 Activity
就会覆盖在原 Activity
之上然后点击 BACK
键会销毁最上面的 Activity
下面的一个 Activity
就会重新显示出来。Android是使用任务 Task
来管理 Activity
的一个任务就是一组存放在栈里的 Activity
的集合这个栈也被称作返回栈Back Stack
。在默认情况下每当我们启动了一个新的 Activity
它就会在返回栈中入栈并处于栈顶的位置。而每当我们按下 BACK
键或调用 finish()
方法去销毁一个 Activity
时处于栈顶的 Activity
就会出栈前一个入栈的 Activity
就会重新处于栈顶的位置。系统总是会显示处于栈顶的 Activity
给用户。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQYQvbTw-1673797568264)(./image/Android_BackStack.png)]
应该根据特定的需求为每个 Activity
指定恰当的启动模式共有四种启动模式可以在 AndroidManifest.xml
中通过给 <activity>
标签指定 android:launchMode
属性来选择启动模式。
standard
: 默认的启动模式不显式指定则默认使用。在standard
模式下每当启动一个新的Activity
它就会在返回栈中入栈并处于栈顶的位置。对于使用standard
模式的Activity
系统不会在乎这个Activity
是否已经在返回栈中存在每次启动都会创建一个该Activity
的新实例同一个Activity
可以被实例化多次。singleTop
: 如果当前返回栈的顶部不存在该Activity
则新建该Activity
并放入栈顶所以不再栈顶的Activity
还是会被多次创建如果当前返回栈的顶部已存在Activity
的一个实例则系统会通过调用该实例的onNewIntent()
方法向其传送Intent
不创建该Activity
的新实例。singleTask
: 如果singleTask
模式指定了不同的taskAffinity
会启动一个新的返回栈。假设在AndroidManifest.xml
中给<activity>
标签指定android:taskAffinity="com.android.task"
如果com.android.task
返回栈不存在系统会新建新的返回栈然后再创建该Activity A
的实例将其压入返回栈中如果com.android.task
返回栈存在而且返回栈中没有该Activity A
则新建Activity A
并放入栈顶如果com.android.task
返回栈存在而且返回栈中已经有该Activity A
则如果发现已经存在该Activity
则直接使用该实例并把在这个Activity
之上的所有其他Activity
统统出栈如果没有发现就会创建一个新的Activity
实例。如果只是指定了android:taskAffinity
属性但是启动模式没有指定为singleTask
模式新启动的Activity
依然会在原来的返回栈中。singleInstance
:singleTask
的升级版创建singleInstance
启动模式的Activity
时系统都会直接创建一个新的返回栈并创建Activity
的新实例置于新Task
返回栈中。之后系统不会将任何其他Activity
的实例放入这个新建的Task
中该Activity
始终是其Task
唯一仅有的成员一旦该模式的Activity
实例已经存在于某个栈中任何应用再激活该Activity
时都会重用该栈中的实例。
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |