Android Activity

1、说下Activity生命周期 ?

onCreate()

表示Activity正在被创建,常用来做些初始化动作,比如调用setContentView()用来加载布局资源,初始化Activity数据。

onReStart()

表示Acitivity正在被重新启动,一般情况下,Acitivity从不见到可见时,都会被调用。

onStart()

表示Acitivity正在被启动,此时Activity可见但不可动即不处于前台,无法进行互动。

onResume()

表示Activity获取到焦点,此时Activity不但可见并处于前台,进行互动操作。这是它与onStart()的区别所在。

onPause()

表示Activity正在被正在停止,此时可做一些存储数据,停止动画的动作。但不可太过耗时,因为这会影响到新Activity的显示,因为新的Activity必须在前者的onPause()完成之后才会执行onResume()。

onStop()

表示Activity即将停止,此处可以做些重量级的回收工作,比如销毁广播接收器,关闭网络等,同样的,不能太过耗时

onDestory()

表示Activity即将被销毁,这是Activity最后一个回调,常用作回收工作,资源释放等。

延伸:

从整个生命周期来看,如果将之配对的话。

onCreate()与onDestory()为一对,分别代表了Activity的创建与销毁,并且有且只有一次调用

onStart()与onStop()为一对,依据为是否可见,两个方法可被多次调用

onResume()与onPause()为一对,依据为是否处于前台,两个方法也可被多次调用




2、Activity A 启动另一个Activity B 会调用哪些方法?如果B是透明主题的又或则是个DialogActivity呢 ?

A onPause()→B onCreate()→onStart()→onResume()→A onStop()

如果B是透明主题,或者为DialogActivity,A不会执行最后的onStop()方法。


3、说下onSaveInstanceState()方法的作用 ? 何时会被调用?

Activity在意外销毁的状况下(系统配置发生改变时导致Activity被杀死并重新创建、资源内存不足导致低优先级的Activity被杀死),Activity会调用onSaveInstanceState()方法,来保存Activity的状态,此方法执行在onStop之前,而与onPause方法没有既定的时序关系。

当Activity被重建后,Activity会调用onRestoreInstanceState()方法,并把在onSaveInstanceState()方法中保存的Bundle对象传参给onRestoreInstanceState()和onCreate(),因此我们可以通过这两个方法,来判断该Activity是否被重建,而该方法是调用在onStart()之后

4、说下 Activity的四种启动模式、应用场景 ?

standard标准模式:每次启动一个Activity不管该Activity是否存在,都会重新创建一个新的Activity实例,而此模式创建的实例,会默认进入启动它的Activity所处的任务栈中。

singleTop栈顶复用模式:每次启动Activity,会先确认该Activity是否处于栈顶位置。如果是,则不会重新创建新的Activity,同时会回调onNewIntent()方法。如果不是,则会重新去创建一个新的实例。

singleTask栈内复用模式:每次启动Activity,会搜寻Activity是否处于某个栈中,如果存在,则不会重新创建新的实例,如果不存在,则会重新创建一个任务栈,并将Activity放入该栈内。

singleInstance单实例模式:一种加强版的singleTask模式,具有此模式的Activity只能单独地存在一个任务栈中,任务栈之中有且只有一个实例


5、了解哪些Activity常用的标记位Flags?

FLAG_ACTIVITY_NEW_TASK:对应singleTask,其效果与在XML指定启动模式相同。

FLAG_ACTIVITY_SINGLE_TOP:对应singleTop,其效果与在XML指定启动模式相同。

FLAG_ACTIVITY_CLEAR_TOP:具有此标记的Activity,当它启动时,会将其所在任务栈自身之上的Activity悉数移出栈,这个标识一般会与singleTask模式一起出现,在这种情况下,如果目标Activity存在,则会回调onNewIntent()方法,如果是standard模式,则会连同存在的当前Activity一起移出栈顶,而后重新创建一个新的实例并放入栈中。

FLAG_ACTIVITY_EXCLUDE_FORM_RECENT:具有该标记的Activity不会出现在历史Activity列表中。


6、说下 Activity跟window,view之间的关系?

Activity在创建时会通过attach()方法初始化一个phoneWindow(继承于Window),每一个Activity都包含有一个phoneWindow。

Activity可通过setContentView()实际上是通过getWindow().setContentView()将View设置到phoneWindow之上,而phoneWindow则是通过内部的WindowManager的addView,removeView,updateViewLayout来管理View。实际上WindowManager相当于接口,最终由WindowMangerImp来实现


7、横竖屏切换的Activity生命周期变化?

不设置Activity的android:configChange=“orientation”时,横竖屏切换会摧毁当前Activity,并重新加载调用各个周期。切横屏时调用一次竖屏时调用两次。onPause()→onStop()→onDestory()→onCreate()→onStart()→onReSume()

如果设置了android:configChange="orentation"属性时,

在android5.1即API23级以下时

Activity依旧会重新调用生命周期

在android9即API28级以下时

Activity不再需要调用各个生命周期,而是只会执行,onConfigurationChange()方法

如果是android3.2即API13以上,还需要设置screenSize配置,因为当横竖屏切换时,该属性也会发生变化,如果设置了该属性,之后即便横竖屏切换,此配置变换Activity也不会再重新启动


8、如何启动其他应用的Activity?

在保证有权限的情况下,一般通过隐式Intent去与目标Activity的intent-Filter进行匹配。

只有与目标Activity的intent-Filter的action,category,data全部匹配成功,才能启动目标Activity

以个Activity可以拥有多个intent-Filter,所以发起intent只要匹配到其中一组,就能够启动目标Activity。


9、Activity的启动过程?(重点)

点击App图标后通过startActivity调用到远程AMS调用中,调用中AMS将新Activity以activityRecord的方式压入Activity栈中,并通过远程Binder回调到原进程,使其进入pause状态 ,原进程再通过binder告知AMS我已pause

AMS再根据栈中的Activity的启动的intent中的flag标签中是否有new_task标签,来判断是否要启动新的进程。启动新进冲通过调用startProcessXXX的函数。

启动新进程后,通过反射调用Activity的ActivityThread的main函数,main函数中调用looper.prepar和looper.loop启动消息队列循环机制,最后远程告知AMS我启动了。AMS再通过回调handleLauncherActivity加载Activity。在handlerLaucherActivity中通过反射调用Application的onCreate和Activity的onCreate以及通过handleResumeActivity中反射调用Activity的onResume

你可能感兴趣的:(Android Activity)