声明 :禁止转载,禁止商业化
Activity概述
Activity 是一个应用组件。用户可与提供的屏幕进行交互。
每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。
Activity是一个典型的模板设计模式。你只需要在相应的回调方法中写你的业务逻辑就好了。
需要掌握的内容:
- Activity的生命周期。
- 任务 和 返回栈
- IntentFilter的相关匹配规则
1. Activity的生命周期
onCreate();
onReStart();
onStart(); Activity 已经创立完成,且是可见的,但是此时Activity并没有在前台
onResume(); Activity 在前台。
onPause()
onStop();
onDestroy();
一般的上面的生命周期都是成对的出现的。
但是请注意:
onStart/onStop是Activity可见的
onResume/onPause() 是Activity 在前台的。
onCreate/onDestroy 是Activity 创建和销毁的。
那么注意到 onReStart 是干嘛的呢?就是调用了 onStop,但是这个Activity又可见的时候调用。
问题一 onStart 和 onResume 到底有什么区别?
这个问题
2. Activity的启动
一共就二种方式:
- startActivity
- startActivityForResult
3. Activity的结束
- finish。
- finishActivity 结束您之前启动的另一个 Activity。
4. 状态保存
概述
当Activity被销毁的时候,Activity对象被销毁了,那么Activity中的状态呢?
二个回调函数:
- onSaveInstanceState()
- onRestoreInstanceSate();
注:由于无法保证系统会调用 onSaveInstanceState(),因此您只应利用它来记录 Activity 的瞬态(UI 的状态)— 切勿使用它来存储持久性数据,而应使用 onPause() 在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)。
不过,即使您什么都不做,也不实现 onSaveInstanceState(),Activity 类的 onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id 属性)。如果小部件没有 ID,则系统无法保存其状态。
也就是说,对于View的状态,你可以不用关心,但是对于 Activity中的一些成员变量,需要你去保存状态。
onSaveInstanceState调用时机
- 在onStop 之前。
- 可能在onPause之前,也可能在onPause之后,没有一个明确的时机。
onRestoreInstanceState时机
- 在onStart之后。
特别注意
onRestoreInstanceState 和 onSaveInstanceState只是Activity生命周期发生异常的时候调用,这个怎么理解?比如系统内存不足回收Activity,或者Activity的横竖屏切换的时候,这个时候就会被调用。
对于Activity 的横竖屏切换时的生命周期和状态的保存问题。
5.协调Activity
如果 ActivityA 启动ActivityB 的时候,过程是怎么样的呢?
- Activity A 的 onPause() 方法执行。
- Activity B 的 onCreate()、onStart() 和 onResume() 方法依次执行。(Activity B 现在具有用户焦点。)
- 然后,如果 Activity A 在屏幕上不再可见,则其 onStop() 方法执行。
任务(task) 和 返回栈(back stack)
任务和返回栈是二个不同的概念,也就是说不是同一个东西。没有搞清楚任务和返回栈这些概念,那么是无法弄懂关于 Activity启动模式等一系列的问题的。
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack), in the order in which each activity is opened.
上面是官网关于 task 和 stack的相关概念说明。
task :为了某个工作的一系列的 activity 集合。
stack : 可以理解为activity 的排列顺序。
一个task 中有一个或者多个Activity,一个stack 中有一个或者多个 task。
下图通过 adb shell dumpsys activity 命令得到某个stack 和 task的相关信息。
可以看出 stack #5 下面有二个 task
分别是:task #89 和 task #90;
其中 task #89 里面有二个 Activity,分别是 ThirdActivity 和 MainActivity。另一个任务栈中只有一个Activity ,即 SecondActivity。
接下来的几个属性:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
请认真弄懂上面的几个属性。特别注意:
taskAffinity 和 singleTask , singleTask一起使用的时候,需要进行多次的测试。 这个不是一两句话可以描述清楚的。
都是针对 task来说的,不是针对 stack 来说的。所以很多的博客,包括很多的书写的都有问题的。他们把task 和 stack 混为一谈,所以尽信书,不如无书,多多实践,只要有疑问,那么就是获得新知识的开始。
Activity的启动模式
这个是需要深入讨论的问题。
Standard
singleTop
singleTask
系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的 onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。
注:尽管 Activity 在新任务中启动,但是用户按“返回”按钮仍会返回到前一个 Activity。
singleInstance
与 "singleTask" 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。
关于 TaskAffinity 任务相关性
这 TaskAffinity 和 singleTask 或者 allowTaskReparenting一起使用,不然就没有什么意义。
对于 TaskAffinity ,对于没有 声明的,这个Activity ,Service等会继承Application的。