Activity基础
Activity是四大组件中出现频率最高的组件,是与用户交互的直接界面,系统采用栈的方式管理Activity。
Activity和View的关系
Activity是和用户交互的组建,也是最直观展示视图的,activity和view是什么关系呢?
每个activity都会包含一个PhoneWindow对象,phonewindow将DecorView设置为整个窗口的根view(这个工作是通过ViewRootImpl实现的),DecorView分为TitleView和ContentView(熟悉吧,setContentView()在activity中常见吧。。。),
Activity生命周期
先上经典图:
生命周期表示了activity从创建到消亡的过程。
onCreate():生命周期的第一个方法,表示activity正在创建。常用来做初始化。
onStart():activity已经被创建,正在被启动,这个过程无法和用户交互。
onResume():activity出现在前台,即active状态,此时的activity处于栈顶,能与用户交互。
onPause():当activity失去焦点,可见但不可与用户交互,比如被一个非全屏的dialog覆盖,所有的状态信息都仍然保存着。
onStop():activity的停止状态,依然持有状态信息等,可以适当做些回收工作。
onRestart():activity重新启动,从不可见变为可见。
onDestroy():生命周期的最后一个方法,表示activity被销毁,可以释放资源。
Activity启动模式
1.
Activity是由栈管理的,先启动的Activity放在栈底,后启动的防灾栈顶,返回时从栈顶到栈底依次返回。当重复多次启动同一个activity时,在这个栈中会重复创建实例还是一直使用同一个实例?这就用到了activity的启动模式。
activity的启动模式分为四种:standard,singleTop,singleTask,singleInstance。
standard:标准模式,系统默认使用此模式,在该模式下,每启动一个activity,都会创建一个实例,即使栈中已经有了这个activity的实例。
singleTop: 使用栈顶实例。如果新启动的activity实例已经在栈顶,那么就会直接使用这个实例,不会重新创建。如果新activity的实例不存在栈中,或者不位于栈顶,那么重新创建。同时调用onNewIntent方法。
singleTask:栈内复用实例。只要在activity栈中存在一个activity的实例,那么启动时,都不会重新创建。如果不在栈顶,那么会把本实例上面的实例都干掉,把此activity的实例调到栈顶。并调用onNewIntent方法。如果不存在,那么重新创建实例放入栈顶。
singleInstance:此模式下的activity在启动后都会放入一个新的栈中。
2.
给activity设置启动模式的两种方式:
(1)在AndroidMenifest.xml中为对应的activity指定launchMode属性。
例如:
<activity
android:name=".mainActivity"
android:launchMode="singleTask"
/>
(2)通过设置intent的flag。
例如:
Intent intent = new Intent(this,newActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Activity保存状态
当activity被系统销毁时,其生命周期方法会被调用,同时会调用onSaveInstanceState方法保存当前Activity的状态数据。当activity重建后会调用onRestoreInstanceState方法恢复数据。