Activity 总结

声明 :禁止转载,禁止商业化

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 的时候,过程是怎么样的呢?

  1. Activity A 的 onPause() 方法执行。
  2. Activity B 的 onCreate()、onStart() 和 onResume() 方法依次执行。(Activity B 现在具有用户焦点。)
  3. 然后,如果 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的相关信息。

Activity 总结_第1张图片
image

可以看出 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的。

IntentFilter

action 的匹配规则

category 的匹配规则

data 的匹配规则

你可能感兴趣的:(Activity 总结)