1.什么是Activity?
Activity,简单来说,就是一个和用户交互的接口。
2.Activity有哪些状态?
①Running状态(Active状态):当前Activity正处在运行状态,获取到了焦点。
②Paused状态:当前Activity处于暂停状态,指的是当前Activity失去焦点,此时的Activity并没有被销毁,内存里面的成员变量,状态信息等仍然存在,当然这个Activity也仍然可见,但是焦点却不在它身上,比如被一个对话框形式的Activity获取了焦点,或者被一个透明的Activity获取了焦点,这都能导致当前的Activity处于Paused状态。
③Stopped状态: Stopped状态下的Activity是完全不可见的,但是内存里面的成员变量,状态信息等仍然存在,但是也没有被销毁。
④Killed状态:表示当前的Activity已经被销毁,它的内存里面的成员变量,状态信息等都会被垃圾回收站回收。
3.Activity生命周期的分析
正常情况下的生命周期:
Activity生命周期
①onCreate():表示Activity 正在创建,常做初始化工作,如setContentView()界面资源、初始化数据。
②onStart():表示Activity 正在启动,这时Activity 可见但不在前台,无法和用户交互。
③onResume():表示Activity 获得焦点,此时Activity 可见且在前台并开始活动。
④onPause():表示Activity 正在停止,可做数据存储、停止动画等操作。
⑤onStop():表示activity 即将停止,可做稍微重量级回收工作,如取消网络连接、注销广播接收器等。
⑥onDestroy():表示Activity 即将销毁,常做回收工作、资源释放。
⑦onRestart():表示Activity由不可见到可见的过程,Activity重新启动。
对应的一些Activity生命周期流程的例子:
Activity启动–>onCreate()–>onStart()–>onResume()
点击home键回到桌面–>onPause()–>onStop()
再次回到原Activity时–>onRestart()–>onStart()–>onResume()
退出当前Activity时–>onPause()–>onStop()–>onDestroy()
4.处于运行状态的Activity即将执行onPause()函数,什么情况下促使Activity执行onPause()方法呢?
①启动了一个新的Activity
②返回上一个Activity
可以理解为当需要其他Activity,当前的Activity必须先把手头的工作暂停下来,再来把当前的界面空间交给下一个需要界面的Activity,而onPause()方法可以看作是一个转接工作的过程,因为屏幕空间只有那么一个,每次只允许一个Activity出现在前台进行工作。通常情况下onPause()函数不会被单独执行,执行完onPause()方法后会继续执行onStop()方法,执行完onStop()方法才真正意味着当前的Activity已经退出前台,存在于后台。
5.Android什么时候只会调用onPause()而不会调用onStop()?
只有以下两种情况:
①当添加 android:theme="@android:style/Theme.Dialog" 。将所跳转的Activity(SecondActivity)修改为Dialog样式时。此时的生命周期为:
FirstActivity---onPause()
SecondActivity---onCreate()
SecondActivity---onStart()
SecondActivity---onResume()
FirstActivity---onResume()
②修改 AndroidManifest.xml中SecondAcitvity属性android:theme="@android:style/Theme.Translucent" 。此时的生命周期为:
FirstActivity---onPause()
SecondActivity---onCreate()
SecondActivity---onStart()
SecondActivity---onResume()
FirstActivity---onResume()
但是此两种情况实际开发中使用较少。
6.屏幕旋转时的生命流程?
onCreate()
onStart()
onResume()
onPause()
onSaveInstanceState()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume
为了避免由于配置改变导致Activity重建,可在AndroidManifest.xml中对应的Activity中设置android:configChanges="orientation|screenSize"。此时再次旋转屏幕时,该Activity不会被系统杀死和重建,只会调用onConfigurationChanged。
与横竖屏生命周期函数有关调用的属性是"android:configChanges",关于它的属性值设置影响如下:
orientation:消除横竖屏的影响
keyboardHidden:消除键盘的影响
screenSize:消除屏幕大小的影响
7.什么时候导致Activity的onDestory()不执行?
当用户后台强杀应用程序时,当前返回栈仅有一个activity实例时,这时候,强杀,是会执行onDestroy()方法的;当返回栈里面存在多个Activity实例时,栈里面的第一个没有销毁的activity执行会ondestroy方法,其他的不会执行;比如说:从mainactivity跳转到activity-A(或者继续从activity-A再跳转到activity-B),这时候,从后台强杀,只会执行mainactivity的onDestroy方法,activity-A(以及activity-B)的onDestroy方法都不会执行。
8.进程的优先级?
前台>可见>服务>后台>空
前台:与当前用户正在交互的Activity所在的进程。
可见:Activity可见但是没有在前台所在的进程。
服务:Activity在后台开启了Service服务所在的进程。
后台:Activity完全处于后台所在的进程。
空:没有任何Activity存在的进程,优先级也是最低的。
9.Activity为什么需要启动模式?
>我们都知道启动一个Activity后,这个Activity实例就会被放入任务栈中,当点击返回键的时候,位于任务栈顶层的Activity就会被清理出去,当任务栈中不存在任何Activity实例后,系统就回去回收这个任务栈,也就是程序退出了。假如这个Activity会被频繁启动,那岂不是会生成很多这个Activity的实例吗?对内存而言这可不是什么好事,明明可以一个Activity实例就可以应付所有的启动需求,为什么要频繁生成新的Activity实例呢?杜绝这种内存的浪费行为,所以Activity的启动模式就被创造出来去解决上面所描述的问题。
10.是否了解Activity的四种启动模式?
四种启动模式:Standerd、SingleTop、SingleTask、SingleInstance。
Standard(默认标准启动模式):每次启动都重新创建一个新的实例,不管它是否存在。且谁启动了这个Acitivity,那么这个Acitivity就运行在启动它的那个Acitivity的任务栈中。
SingleTop(栈顶复用模式):如果新的Activity已经位于任务栈的栈顶,那么不会被重新创建,而是回调onNewIntent()方法,通过此方法的参数可以取出当前请求的信息。
SingleTask(栈内复用模式):这是一种单例模式,在这种模式下,只要Acitivity在一个栈中存在,那么多次启动此Acitivity都不会重建实例,而是回调onNewIntent方法。同时由于SingleTask模式有ClearTop功能,因此会导致所要求的Acitivity上方的Acitivity全部销毁。
SingleInstance(单实例模式):和栈内复用类似,此种模式的Acitivity只能单独位于一个任务栈中,全局唯一性。单例实例,不是创建,而是重用。独占性,一个Acitivity单独运行在一个工作栈中。
11.如果假设A是Standard,B是SingleTop,C是SingleTask,D是SingleInstance的启动模式,那么以A->B->C->D->A->B->C->D这种情况开启Activity,分析一下最后的工作栈是怎样的情况?
此题在理解启动模式的情况下解答。
解答
以下有一篇文章Activity的启动模式有关于此题的介绍。
网友评论