Android 系统组件不一样于普通类对象,可以直接建立实例,须要各自的上下文环境——Context。
Context 上下文环境确保 Android 系统组件(Activity、Service、BroadcastReceiver)可以正常工做。java
Context 大体分为三种类型(一般能够通用):android
getApplication() = getApplicationContext() = Application
getApplicationContext() 方法的做用域更广,任何一个 Context 实例(Activity, Service)经过调用 getApplicationContext()
方法均可以获取到 Application。app
ContextWrapper 中的方法经过组合委托方式交由 ContextImpl 具体实现。
getBaseContext() = ContextImplide
Context 数量计算公式: Context 数量 = Activity 数量 + Service 数量 + 1(Application)
oop
Android 使用任务(Task)返回栈(Back Stack)管理 Activity,任务是一组存放在栈(后进先出)里的 Activity 集合。布局
返回栈管理 Activity 的入栈出栈操做,例如:启动新的 Activity 执行入栈操做;Back 键返回或调用 finish()
方法,销毁 Activity 执行出栈操做。spa
系统老是显示处于栈顶的 Activity。线程
任务(Task)从前台移至后台时,返回栈中全部的 Activity 都会进入中止状态,可是各个 Activity 在栈中的顺序都会原封不动保留。code
运行状态xml
Activity 处于返回栈的栈顶位置,正在运行与用户发生着交互,系统不肯回收此种状态的 Activity。
暂停状态
Activity 再也不处于返回栈的栈顶位置,可是依然可见,并不是每一个 Activity 都会占满屏幕,例如对话框形式的 Activity 只是占据部分区域,其后面的 Activity 是可见的。系统一样不肯回收此种状态的 Activity,除非在内存严重不足的状况下,才考虑回收此种状态的 Activity。
中止状态
Activity 再也不处于返回栈的栈顶位置,而且彻底处于不可见状态,系统仍然会保存中止状态的 Activity 的成员变量,但并不可靠,当其余地方须要内存时,系统可能回收此种状态的 Activity,保证内存充足。
销毁状态
Activity 从返回栈出栈变为销毁状态,系统乐于回收此种状态的 Activity,保证内存充足。
onCreate() 方法在 Activity 第一次被建立的时候调用,完成 Activity 初始化操做,例如加载布局、绑定事件...。
onStart() 方法在 Activity 由不可见变为可见的时候调用。
onResume() 方法在 Activity 准备好与用户进行交互的时候调用。
onPause() 方法在系统准备启动或者恢复另外一个 Activity 的时候调用。
onStop() 方法在 Activity 由可见变为不可见的时候调用。
onDestroy() 方法在 Activity 销毁以前调用。
onRestart() 方法在 Activity 由中止状态变为运行状态的时候调用。
onPause() ——> onResume() 暂停状态向运行状态切换。对话框式 Activity 没法占满屏幕,其后面的 Activity 依然可见。
Activity 回收状况
Activity 执行 onStop()
方法,处于中止状态(不可见),可能被系统回收。
若系统内存充足,保留 Activity 状态数据,当用户再次返回 Activity,执行 onRestart()
方法。
若系统内存不足,将 Activity 回收,用户再次返回 Activity,执行 onCreate()
而非 onRestart()。
Activity 提供 onSaveInstanceState()
回调方法,保证在 Activity 被回收以前调用此方法,保存临时数据。随后能够在 Activity onCreate(Bundle savedInstanceState)
方法恢复数据。
定义启动模式
<activity>
标签的 android:launchMode
属性。startActivity()
方法时使用 Intent FLAG 参数。standard 模式不在意一个 Activity 是否已经存在于返回栈之中,每次启动都会建立新的 Activity 放入返回栈中。
singleTop 模式启动 Activity 时,若是当前返回栈的栈顶位置已经是该类型 Activity,则无需建立新的实例,直接使用栈顶位置的 Activity。若是该类型 Activity 存在于返回栈中,但并不是处于栈顶位置,仍是会建立新的 Activity 实例。
singleTask 模式启动 Activity 时,若是当前返回栈中存在该类型 Activity,则直接使用该 Activity 实例,并将这个 Activity 实例之上的 Activity 通通出栈。若是整个返回栈中不存在该类型 Activity,仍是会建立新的 Activity 实例。
singleTop 和 singleTask 都是为了解决重复建立 Activity 问题,singleTop 的做用域是栈顶,singleTask 的做用域是整个返回栈。
singleInstance 建立活动到独立返回栈,从而实现不一样程序能够共享 Activity 实例。
taskAffinity 参数用于指定 Activity 依附于哪一个任务。
ActivityManagerService,负责系统中全部的 Activity 的生命周期。
ActivityThread,App 真正的入口,执行 main()
方法,初始化主线程的消息循环队列。
Zygote,Linux 系统全部进程均是由 “init“ 进程拷贝(fork)而来。
点击应用图标 Launcher 程序将点击事件转换为 startActivity(intent),经过 Binder IPC 路由通知 ActivityManagerService。ActivityManagerService 首先经过 PackageManager 收集 intent 信息,而后检查是否具备唤醒组件的权限,开启新的 TASK(FLAG_ACTIVITY_NEW_TASK),最后建立进程去实例化组件。
建立进程过程:
ActivityManagerService Process.start() 由 Zygote 进程(Linux init 进程)孵化出应用进程,并实例化 ActivityThread(主线程/UI 线程)对象执行 main()
方法,初始化主线程的 Looper、Handler,开启消息循环队列,无限等待消息到来(Looper.loop()
)。
绑定应用过程: bindApplication()
方法发送 BIND_APPLICATION
消息到消息循环队列,关联(attach)建立的进程和应用程序。加载应用程序 Class 到线程私有内存空间。
启动 Activity 过程: realStartActivity()
发送 LAUNCH_ACTIVITY
消息到消息循环队列,启动 Activity 管理自身生命周期,首先回调 onCreate()
方法。
自定义 scheme 协议以便跳转至 App 指望到达的各个页面,可由服务端定制化。
Fragment 是一种能够嵌入在 Activity 中的 UI 片断,就好像是 mini Activity 一样包含布局,并拥有本身的生命周期。Android 引入 Fragment 概念,力求在开发过程当中同时兼顾手机和平板屏幕的大小。
静态建立方式和动态建立方式
<fragment>
标签,经过 android:name
属性指定 Fragment 类名。动态添加过程:
getSupportFragmentManager()
方法能够获得。FragmentTransaction.commit()
不一样之处在于,是否清空容器后再添加 Fragment,replace()
会清空而 add()
不会。一般 add()
方法须要配合 hide()
或 remove()
方法一块儿使用,而 replace()
方法通常单独使用。
transaction.replace(viewId, fragment);
等价操做:
transaction.add(viewId, fragment); transaction.show(fragment); transaction.hide(preFragment); transaction.remove(preFragment);
Activity 调用 Fragment 方法:Activity FragmentManager findFragmentById()
方法获取 Fragment 实例。
Fragment 调用 Activity 方法:Fragment getActivity()
方法获取 Activity 实例。
Fragment 调用 Fragment 方法:Activity 做为中介。
FragmentTransaction 提供 addToBackStack()
方法,能够添加事务到返回栈中。根据应用需求决定是否使用 addToBackStack()
方法。例如 Back 键返回时显示上一次 FragmentTransaction 记录结果,则需事先调用 addToBackStack()
方法。
addToBackStack() 方法保存的是一系列针对 FragmentTransaction 的操做记录。
运行状态:Fragment 所关联的 Activity 处于运行状态
暂停状态:Fragment 所关联的 Activity 处于暂停状态
中止动态:当 Activity 进入中止状态时,与它相关联的 Fragment 就会进入中止状态。或者经过调用 FragmentTransaction 的 remove()
、replace()
方法将 Fragment 从 Activity 中移除,但在事务提交以前调用 addToBackStack()
方法,这时 Fragment 也会进入中止状态。
销毁状态:Fragment 依附于 Activity 而存在,所以 Activity 销毁,与它相关联的 Fragment 就会进入销毁状态。或者经过调用 FragmentTransaction 的 remove()
、replace()
方法将 Fragment 从 Activity 中移除,但在事务提交以前没有调用 addToBackStack()
方法,这时 Fragment 也会进入销毁状态。
onAttach()
onCreateView()
onActivityCreated()
onDestroyView()
onDetach()
除了与 Activity 相同的生命周期回调方法以外,Fragment 还附加几个回调方法。
onAttach():当 Fragment 和 Activity 创建关联的时候调用
onCreateView():为 Fragment 建立视图(加载布局)的时候调用
onActivityCreated():确保 Fragment 和关联的 Activity 都建立完毕
onDestroyView():当 Fragment 移除视图结构的时候调用
onDetach():当 Fragment 和 Activity 解除关联的时候调用
与 Activity 生命周期协调一致
ViewPager extends ViewGroup,容许用户左右滑动(幻灯片效果)浏览视图,并根据提供的 PagerAdapter 填充数据。
FragmentPagerAdapter 与 FragmentStatePagerAdapter 的区别
ViewPager 提供两种页面适配器(PagerAdapter)来管理不一样的 Fragment 之间滑动切换。
FragmentPagerAdapter:ViewPager 中的全部 Fragment 实例常驻内存,当 Fragment 变得不可见时仅销毁视图结构,即调用 onDestroyView()
方法。因为 FragmentPagerAdapter 内存消耗较大,因此适合少许静态页面的场景。
FragmentStatePagerAdapter:当 Fragment 变得不可见时,不只销毁视图层次,Fragment 实例也被销毁,即调用了 onDestroyView()
和 onDestroy()
方法,仅保存 Fragment 状态。相比而言, FragmentStatePagerAdapter 内存占用较小,因此适合大量动态页面的场景。