文章仅做个人笔记使用:
生命周期:
onCreater():系统首次创建Activity时调用,接收onSaveInstanceState的数据,设置活动界面布局,初始化成员等一些初始化活动
onStart():界面正在启动状态,但是不处于前台不可交互。
onResume():界面可见,可交互。
onPause():表示界面正在停止,正常情况下紧接着就会调用onStop()方法,但是在快速回到当前界面就会调用onResume()。在这里做一些数据存储关闭动画的操作,但是不能太耗时,否则会影响新的Activity的显示。当前界面的onPause必须执行完新的Activity 的onResume才会执行。从源码中得知,新的Activity启动之前,栈顶的Activity必须先要onPause(),新的Activity 才能启动。
onStop():界面即将停止,可以做一些重量级的回收工作,也不能太耗时。
onDestory():界面即将被销毁,做最后的回收工作和资源释放。
onRestart():表示界面正在重新启动,从不可见变为可见就会调用该方法.
异常状态下的生命周期:
横竖屏切换、处于低优先级的Activity被销毁都属于异常关闭,系统都会将Activity销毁后重建。
onSaveInstanceState():保存简单轻量的界面状态。但是在用户通过显式意图关闭Activity或者通过finish()关闭Activity系统将不会调用该方法。只会在异常关闭的情况下调用。在onStop()之前,相对于onPause()则没有先后顺序。
onRestoreInstanceState():在onStart()之后调用。
在onCreater()和onRestoreInsteanceState()中都可以拿到保存的bundle数据,区别是在onRestoreInsteanceStete()一旦被调用就一定会有保存的数据,但是onCreater中可能为空需要做判空处理。
通过配置configChanges可以阻止Activity的销毁和重建,例如配置android:configChanges="orientation|screenSize" 就可以在屏幕旋转的时候组织Activity的销毁和重建会执行onConfigurationChanged()方法。在Activity被异常关闭的情况下onSaveInstanceState()同样会执行。
Toast 和 Dialog对Activity的生命周期是没有影响的。
只有再启动另外一个Activity的时候才会进入onPause状态,而不是想象中的被覆盖或者不可见
同时通过AlertDialog源码或者Toast源码我们都可以发现它们实现的原理都是windowmanager.addView();来添加的, 它们都是一个个view ,因此不会对activity的生命周期有任何影响。
启动模式:
标准模式:每次都会创建实例,并且将实例加入启动他的Activity所在的栈内。
站顶复用模式:如果被启动的Activity不在启动他Activity的栈顶,就会重新实例化,否则不会重新实例。onNewIntent()会调用。onCreater和onStart不会被调用。
站内复用模式:单实例模式,默认具有clearTop属性,会让在被启动的实例之上的Activity出栈。
单实例模式:单实例模式,是站内复用的加强版,系统会为以这种模式启动的Activity单独创建一个任务栈。
标志位/Flags:
通过LaunchMode配置启动模式和通过标志位addFlags启动,后者优先级高于前者。并且前者不能为Activity设置FLAG_ACTIVITY_CLEAR_TOP(如果被启动的Activity是通过标准模式启动,那么连同他在内以及在他之上的都要出栈)标识,后者无法设置单实例模式。
Activity之间通信方式:
- 通过Intent传递参数,或者进行bundle封装再传递。
- 借助类的静态成员变量进行传递。
- 借助全局变量来实现
- 借助外部存储来实现数据传递。
SharedPreference
file
数据库
Activity与Serviece之间通信方式:
1.通过Activity绑定Serviece来进行通信。绑定Service的时候会创建一个ServiceConnection,可以拿到OnBind返回的binder对象。
2.通过Handler发送消息给Activity.
3.通过广播发送消息给Activity.
Activity启动过程:
涉及Instrumentation(仪器仪表)、ActivityThread和
ActivityManagerService。
简单来说启动Activity的请求会由Instrumentation来处理,然后通过Binder向AMS发送请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步。AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。