Activity的生命周期
在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。
Activity有四种本质区别的状态
- 在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
- 如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity
被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。 - 如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
- 如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
onCreate():Activity第一次创建时被调用。该方法默认继承了super.onCreate(savedInstanceState)用于保存活动之前状态。
onStart():在onCreate()方法执行完随便执行的方法,此时视图还是不可见状态。
onResume():Activity进入可见状态但未完全可见,当onResume执行之后,Activity进入完全可见并且可交互状态。
onRestart():当Activity执行至onPause()方法,然后又重新启动时调用。
onPause():当系统准备将当前Activity后台时调用,此时活动处于暂停状态。通常停止一些动画以及比较占用CPU资源的动作,为了尽快的切换到下一个Activity,或者关闭一些专用的入口。
onStop():当Activity对用户不可见时调用。这可能发送在活动即将被销毁,或者另外一个Activity重新启用并覆盖它。
onDestroy():在Activity销毁前调用。这是Activity执行的最后一个方法。
Fragment生命周期
Framgent可以理解为是Activity的一个子组件,可以在一个Activity中包含多个Fragment。它有自己的生命周期,但是依赖Activity的生命周期。
Activity通过FragmentManager对Fragment进行管理,包括添加、替换和移除。
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.fragment_container, new MyFragment());
transaction.commit();
onAttach():fragment关联Activity。
onCreate():系统创建fragment的时候回调它。 Fragement 也可以 重写 onSaveInstanceState(BundleoutState) 方法, 保存Fragement状态。
onCreateView():第一次使用时,fragment会在上面加载已给layout布局出来。
onActivityCreated():当Activity中的onCreate方法执行完之后调用,用来判断活动是否已经被创建。
onStart():和Activity一致,启动fragment时回调,此时fragment可见。
onResume():和Activity一致,在Activity中运行时可见的。fragment为当前视图,可获取焦点。
onPause():和Activity一致,其他fragment可以获得焦点,用户当前暂时离开了这个fragment。
onStop():和Activity一致,fragment不可见的。
onDestroyView():fragment中的布局被移除时调用。表示fragment销毁相关联的UI布局,清除所有跟视图相关的资源。
onDestroy():销毁fragment对象。
onDetach():解除fragment和Activity的关联时调用。
Activity的启动模式
在Activity系统中,我们把TaskRecord叫做是任务栈,而我们启动的Activity即是包装成一个个ActivityRecord,它记录了Activity的所有信息。启动一个Activity让它显示到前台的操作为入栈,退出一个Activity并销毁为出栈。
- Standard:不复用模式。启动的Activity会重新创建,并压入栈顶。
- SingleTop:栈顶复用模式。启动的Activity会判断当前栈顶是否已经存在实例,如果存在,直接复用,若不存在,重新创建并压入栈顶。
- SingleTask:栈内复用模式。启动的Activity会判断当前栈内是否已经存在实例,如果存在,清除之上的所有Activity实例,让该Activity处于栈顶,若不存在,重新创建并压入栈顶。
- SingleInstance:该Activity会在一个单独的任务栈中运行,且该任务栈中,只有这一个Activity实例。
Activity的通信
Intent
Intent(意图),是用于应用组件间通信和启动组件的对象。可以使用显示Intent(指定目标组件),或隐式Intent(不指定目标组件)。
Intent Filter用于AndroidManifest.xml中声明Activity可以响应哪些Intent。
Bundle
常用于复杂数据的传输,将多个数据包装成Bundle对象,再通过Intent传递Bundle在应用组件之间。
Configuration Changes
配置变化,可以在AndroidManifest.xml中使用android:configchanges属性处理配置变化。
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize">
</activity>
当设置配置发生变化,如屏幕旋转、语言切换等,Activity会重新创建以适应新的配置。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 处理横屏
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
// 处理竖屏
}
}