概括
- Android应用没有特定的单一入口,Activity可以作为程序的入口
- Activity必须在manifest中注册,对应标签为<activity>,唯一必须的属性是<name>,指定activity的类名;十分有用的属性是<intent-filter>,使得该activity可以被隐式地调用
生命周期
- onCreate(Bundle savedInstanceState):
- 必须实现的回调,在Activity被系统创建出来的时候调用,setContentView()应该写在该回调中
- 接受的参数是savedInstanceState包含此前被onSaveInstanceState(Bundle outState)保存的bundle,如果这个activity从未出现过,那么该参数为null
- 如果有lifecycle-aware组件,在onCreate()阶段会受到一个ON_CREATE事件
- onStart():onCreate()调用结束之后,Activity进入Started状态时调用,之后Activity变得可见,在该回调中可以初始化维护UI的代码
- onResume():在Activity和用户进行交互之前调用,此时该Activity处于栈的顶端。应用的大部分核心功能在此处实现。
- onPause():当Activity失去焦点进入Paused状态的时候调用,意味着Activity仍然部分可见,但用户正在离开;
- 处于Paused状态的Activity仍然可能更新UI
- 处于Paused状态的Activity可能完全可见,只是失去焦点不能交互,比如多窗口模式下
- 不要在onPause()回调中进行数据保存或者网络操作,因为onPause()的执行时间很短,可能没有足够的时间完成这些操作
- onPause()回调中可以执行一些释放UI无关资源的操作节省资源
- onPause()执行结束之后,下一个回调函数要么是onStop()要么是onResume():取决于Activity进入Paused状态之后发生了什么
- onPause()执行结束并不意味着Activity离开Paused状态,完全不可见之后才会离开Paused状态
- onStop():Activity变得不再可见后调用,接下来要么调用onRestart()重新与用户交互,要么调用onDestroy()被完全销毁,可以在onStop()中进行数据保存和网络操作
- onRestart():当处于Stopped状态的Activity将被restart的时候调用,恢复activity在被stopped时的状态,随后将调用onStart()
- onDestroy(): 在activity被销毁前调用,释放资源的操作放在这里,activity被销毁有两种情况:
- 回退或者调用了finish(),这种情况下activity就完全gone了
- 被系统回收或者配置改变(例如旋转屏幕)导致activity重建,这种情况下,系统会记得Activity的存在,当用户回到这个activity时,会使用之前保留的数据重建这个activity,为了让系统能保留控件的数据,控件必须要有id
- onSaveInstanceState()
- 在此函数会对空间数据进行保存,例如EditText的文字,listView的滚动位置
- 显式调用finish()是不会调用onSaveInstance()函数的
- 不应该在此回调中进行数据持久化,应该在
- onRestoreInstance()的调用时机在onStart()之后
Activity跳转过程的生命周期顺序
- A的onPause()
- B的onCreate(),onStart(),onResume()
- A的onStop()
Task与回退栈
- 定义启动模式
- 通过manifest定义
- 通过IntentFlags定义
- 四大启动模式与intentFlag
- standard,标准模式,创建一个新的实例压入当前task的栈顶
- singleTop,FLAG_ACTIVITY_SINGLE_TOP如果目标activity已经在当前task的栈顶,系统会通过调用onNewIntent()直接使用这个activity而不是创建一个新的实例
- singleTask,FLAG_ACTIVITY_NEW_TASK如果没有存在实例系统会创建一个新的task栈,然后创建新的activity实例压入到新的task栈中;如果有,通过onNewIntent直接调用
- singleInstance 目标activity所处的task不会再放入其他activity,目标activity将是其中唯一的activity
taskAffinity
- affinity用来标识一个activity应该属于哪一个task,默认情况下同一个应用的所有app都具有同一个affinity
- 通过<activity>的<taskAffinity>属性来定义affinity
清空回退栈
- 如果用户离开了某个task太长时间,系统会清空task里面除了根activity以外的activity,可以通过以下方式更改这种情况:
- 设置task的根activity的alwaysRetainTaskState为true,task里的activity都会保留
- 设置task的根activity的clearTaskOnLaunch为true,task里的所有activity包括根activity都会被清空
- 设置某个activity的finishOnTaskLaunch属性,效果类似于clearTaskOnLaunch,但是作用于某个activity上的,而不是整个task
进程和应用生命周期
- 前台进程
- 正在运行一个和用户交互的Activity
- 正在运行BroadcastReceiver的onReceive()方法
- 正在运行Service的onCreate()或onStart()或onDestroy()方法
- 可见进程
- 正在运行一个可见的Activity
- 正在运行一个通过startForeground()运行的Service
- 服务进程
- 持有一个通过startService()方法运行的Service
- 缓存进程
- 系统不再需要的进程
- 这些进程通过一个伪LRU表保存
Parcelable和Bundle
- 不是bundle的数据体积不能超过1M,而是Binder的buffer只有1M
Loader
- Android3.0引入,用于在Activity或者Fragment中异步加载数据
- 监控其数据源并在内容变化时传递新结果
- 在某一配置更改后重建加载器时,会自动重新连接上一个加载器的游标
- 相关概念
- LoaderManager 与Activity或者Fragment相关联的抽象类,用于管理一个或多个Loader实例
- LoaderManager.LoaderCallbacks 回调接口,用于与LoaderManager进行交互
- Loader 加载器的抽象基类,通常使用的实现是CursorLoader