赞
踩
Android有四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。
介绍:Activity是Android的四大组件之一,是用户操作可视化界面;它为用户提供了一个操作的页面。在我创建一个新的Activity之后,需要调用setContenView()方法来显示页面,以此来为用户提供交互。在Android APP中只要能看到的页面都是依附于Activity显示的,同样Activity是在开发中使用最多最频繁的一种组件。
在一个Activity从页面开始到显示再到结束一共有7个生命周期方法
onCreate()
create表示创建,生命周期的第一个方法,也是在Android开发中接触最多的生命周期方法,表示Activity
正在创建。一般会在这个方法中做一些初始化工作比如:setContentView加载布局,对一些控件和变量进行初始化等。此时Activity还在后台,不可见。
onStart()
start标识Activity正在启动,这时Activity还没有显示在前台页面上,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
onResume()
resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
onPause()
pause标识页面暂停,当Activity页面跳转到另一个Activity页面时或者应用正常退出时都会执行这个方法。此时Activity还处于前台可见状态,因此可以在此方法做一些轻量级的数据存储工作但是不能太耗时。因为在跳转Activity时只有当前Activity执行了onPause方法后另一个新的Activity方法才能启动,而且在Android中指定了onPause在500ms内没用完全执行完毕的话会强制关闭Activity。
onStop()
stop标识停止,此时Activity已经处于不可见的状态,但是Activity还在内存中没有被完全的关闭销毁。这里主要做一些资源回收的工作。
onDestroy()
destroy表示销毁,这个阶段说明页面已经完全被销毁了,不可见,我们可以将一些没有没有被释放的资源进行释放,以及进行一些回收工作
onRestart()
restart表示重新开始,Activity这里是可见的,当Activity_A页面转到Activity_B页面,又从Activity_B页面返回到Activity_A页面或者当用户直接按Home键返回到桌面上后又切换到Activity页面就会触发这个方法。这里一般不进行操作
当Activity_A页面切换到Activity_B页面的执行顺序是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sq2euACh-1644817774816)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210095135989.png)]
其实Activity的生命周期除了onRestart方法其余六个是两两对应的,那么相邻的方法有什么区别呢?
1、可见与不可见的区别,onCreate是正在创建为不可见,onStart处于正在启动状态处于可见的状态
2、执行次数的区别,onCreate方法只有在Activity创建的时候执行一次,而onStart方法在重新进入或者切换到Activity页面的过程中都会被多次调用,因为Bndle数据恢复在onStart中进行比在onCreate进行要更加合适
3、onCreate能做的事其实onStart都能做,但是onStart能做的事onCreate未必都能做到;比如setContentView和资源初始化在两者都能做。但是初始化动画onCreate就不能做,因为onCreate是处于不可见状态所以不会显示效果,所以在onStart做初始化动画比较合适。
1、两者因为都处于可见状态,但是不是都处于前台可操作的状态,比如:onStart是处于可见状态但是不在前台,不能进行交互,而onResume处于前台可见状态,因此可以行数据交互。
2、职责不同,onStart方法还是主要进行一些初始化的工作,而onResume方法,根据官方的建议可以做一些开启动画和可与用户交互的工作
1、可见与不可见的区别;onPause是暂停状态但是还是可见的状态,而onStop处于已经停止了也不可见的状态但是Activity还在内存中。
2、在系统存在内存不足时可能不会执行onStop方法,因为在做数据存储、状态保存以及程序状态保存时最好在onPause中进行,但是不要太耗时。
1、onStop处于停止状态但是Activity还处于内存中,可以通过切换页面来唤醒Activity页面;但是onDestroy已经表示Activity已经被销毁了。
(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop
而不是
(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
1、因为Activity或多或少都会占用一些内存在官方的建议,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
Activity有四种启动方式分别为:默认启动模式standard、栈顶复用模式singleTop、栈内复用模式singleTask、全局唯一模式singleInstance四种模式,这四种也有不同的特征和区别,下面就一一介绍。
一个android应用程序功能通常会被拆分为多个Activity,而各个Activity之间通过Intent进行连接,android系统通过栈结构来保存整个程序的Activity,栈底的元素是整个栈任务的发起者。
正常情况下,当一个Activity启动了另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,而启动它的Activity虽然功成身退,但依然保留在任务栈中,处于停止状态(如果没有finish),当用户按下返回键或者调用finish()方法时,系统会移除顶部的Activity,让后面的Activity恢复活动状态。但是,可以给Activity设置一些“特权”,来打破这种“和谐”的模式。这种特权,就是通过在AndroidManifest.xml文件中的属性android:launchMode来设置或者通过Intent的flag来设置的。
<activity android:name=".MainActivity"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
如果开发时不在manifest设定,那么Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1uLW4Et0-1644817774817)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210102239166.png)]
返回页面时也是依次销毁页面的,这是最简单的一个模式。
在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity而是直接切换到该Acitvity;如果栈顶Activity不是我们要新建的Activity才会去新建一个Activity。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-an0K2YUI-1644817774817)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210103854059.png)]
<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=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Activity2" android:launchMode="singleTop"> <intent-filter> <action android:name="ONETEXT_TWOACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".Activity3"> <intent-filter> <action android:name="ONETEXT_THREEACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application>
可以手动设置通过:android:launchMode="singleTop"对当前Activity进行设置启动模式
通过这种设置可以避免已经创建过的Activity被重复创建
与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例会将:将task内的对应Activity实例之上的所有Activity弹出栈。将对应Activity置于栈顶,获得焦点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQUHyNUn-1644817774818)(/Users/caokun/Library/Application Support/typora-user-images/image-20220210105422872.png)]
这是第四种模式,也是相对于比较复杂的一种模式:在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)
这种启动模式和singleTask几乎一样,它也只允许系统中存在一个目标Activity,包括上面我们所说的SingleTask的一些特性singleInstance都有。singleInstance翻译过来是单例的意思:TA有两层含义:1.告诉系统,我是独一无二的,2.告诉任务栈我是独一无二的,也就是说,任务栈中除了我不能再有其他Activity。
所以,如果要启动singleInstance模式的Activity,那只能新创建一个任务栈用来放它,因为人家说了,“我是独一无二的!”。同样的,如果从这种启动模式的Activity中启动别的Activity,那不好意思,我不管你是不是和我处在同一个应用,我所在的任务栈只能拥有我一个人,您呐,另外让系统给你创建一个任务栈待着去吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。