四大组件之Activity

1、Activity是什么

  Activity作为Android的四大组件之一,Activity在Android系统中是以界面的形式进行体现,是四大组件中唯一一个可以与用户交互的组件。

2、Activity能做什么

通过activity,用户可以跟app进行交互,从而实现对软件的操作;

3、Activity的基本方法介绍

3.1、onCreate(Bundle)

  是初始化界面的地方。最重要的是,在这里你通常会调用setContentView(int)和一个定义你的UI的布局资源,并且使用findViewById(int)来检索你需要以编程方式进行交互的那个UI中控件。

3.2 、onPause()

  是你对于用户离开界面的处理。最重要的是,此时用户所做的任何更改都应该提交(通常发送给持有数据的ContentProvider。

要使用Context.startActivity(),所有界面类必须在其包下的AndroidManifest.xml中具有相应的声明。

4 、Activity的生命周期

生命周期中各个方法的解析

4.1 、onCreate()

  在第一次创建活动时调用。 这是你应该完成所有常规静态设置的位置:创建视图,将数据绑定到列表等。此方法还会为你提供一个包含Activity先前保存页面状态的Bundle对象(如果有的话)。总是跟着onStart()方法。

4.2、onRestart()

  在你的界面停止后调用,然后再次启动。总是跟着onStart()

4.3、onStart()

  当界面对用户变得可见时调用。如果活动进入前台,则跟随执行onResume()方法,如果隐藏,则执行onStop()。此时,Activity实际已经可见,但是没出现在前台,无法交互。
4.4、onResume()

  当界面对用户变得可见时调用。如果界面进入前台,则跟随onResume()方法,如果隐藏,则执行onStop()方法。此时,Activity已经可见,并且出现在前台并开始活动。要注意的是onStart()被执行时Activity显示在后台,只有当onResume()被执行的时候Activity才显示到前台;

4.5、onPause()

  onPause()方法在系统即将开始显示其他的界面时调用。这通常用于将未保存的更改进行保存,并保存为持久化数据,并且会执行例如停止动画和其他可能消耗cpu的内容等。此方法的实现必须非常快速,因为在此方法返回之前,下一个界面不会显示。如果界面返回到前台,则跟随onResume();如果对用户不可见,则使用onStop()。onPause()方法执行后,Activity界面切换为后台程序。

4.6、onStop()

  onStop()方法会在当界面对用户不再可见时调用,因为另一项界面正在显示并要去覆盖这个界面。 这可能是因为一项新的界面正在开始,其他的界面会被显示为前台界面,或者这个界面正在被摧毁。如果这个界面快速的回显与用户交互紧接着onRestart()会被执行,否则,这个界面回销毁onDestroy()方法会被执行。

4.7、onDestroy()

  在你的界面被销毁前被最后调用的方法。 这可能是因为界面正在结束(有人在其中调用finish()方法因为系统会暂时销毁此Activity界面的实例以节省空间,你可以使用isFinishing()方法区分内存空间是否节省资源的这两种情况)。

5、异常情况想生命周期详解

5.1、横竖屏切换时的生命周期

此时的生命周期跟清单文件里的配置有关系。
①不设置Activity的android:configChanges时,切换横竖屏会重新调用整个生命周期,销毁当前 activity,然后重新加载,跟系统配置有关。(android:configChanges的配置)
②onSaveInstanceState()方法会在当前页面销毁钱被调用储存数据,onRestoreInstanceState()方法会被执行去去除保存的Bundle对象的内容,进行一次横竖屏切换时Activity所执行的生命周期方法以及在onSaveInstanceState与onRestoreInstanceState打印相应日志,如下图所示:

③对于onRestoreInstanceState()方法,源码中的注释如下:当这个界面从之前保存的状态重新初始化时,这个方法在onStart之后被调用,这里在savedInstanceState中给出。大多数时,可以直接从onCreate()方法中的Bundle对象从中获取内容来恢复之前的页面状态,但有时在完成所有初始化或允许子类决定使用默认实现之后,在此处执行重新获取已存储数据的操作很方便。 此方法的默认实现会还原之前由onSaveInstanceState保存的任何视图状态。
④根据源码得知onRestoreInstanceState()方法的默认实现会还原之前有onSaveInstanceState()保存的任何视图状态;

6、Activity任务与任务管理栈

 6.1、任务与任务栈概述

任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即任务栈)中。

  • 设备主屏幕是大多数任务的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务将出现在前台。 如果应用不存在任务(应用最近未曾使用),则会创建一个新任务,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。

当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行。 下图 通过时间线显示 Activity 之间的进度以及每个时间点的当前返回栈,直观呈现了这种行为。

6.2任务栈关联

关联指 Activity 优先属于哪个任务。默认情况下,同一应用中的所有 Activity 彼此关联。 因此,默认情况下,同一应用中的所有 Activity 优先位于相同任务中。 不过,可以修改 Activity 的默认关联。 在不同应用中定义的 Activity 可以共享关联,或者可为在同一应用中定义的 Activity 分配不同的任务关联。

  • 可以使用activity元素的 taskAffinity属性修改任何给定 Activity 的关联。

taskAffinity 属性取字符串值,该值必须不同于在AndroidManifest.xml文件中声明的默认软件包名称,因为系统使用该名称标识应用的默认任务关联。

在两种情况下,关联会起作用:

  1. 启动 Activity 的 Intent 包含 FLAG_ACTIVITY_NEW_TASK标志。

  2. Activity 将其allowTaskReparenting 属性设置为 true。

    在这种情况下,Activity 可以从其启动的任务移动到与其具有关联的任务(如果该任务出现在前台)。

6.3、清理任务栈

如果用户长时间离开应用,则系统会清除应用下所有除 Activity 的所有 Activity 。 当用户再次返回到任务时,仅恢复根 Activity。系统这样做的原因是,经过很长一段时间后,用户可能已经放弃之前执行的操作,返回到任务是要开始执行新的操作。
可以使用下列几个 Activity 属性修改此行为:

  • alwaysRetainTaskState
    如果在任务的根 Activity 中将此属性设置为 true`,则不会发生刚才所述的默认行为。即使在很长一段时间后,任务仍将所有 Activity 保留在其堆栈中。

  • clearTaskOnLaunch
    如果在任务的根 Activity 中将此属性设置为 "true",则每当用户离开任务然后返回时,系统都会将堆栈清除到只剩下根 Activity。 换而言之,它与 alwaysRetainTaskState 正好相反。 即使只离开任务片刻时间,用户也始终会返回到任务的初始状态。

  • finishOnTaskLaunch
    此属性类似于 clearTaskOnLaunch,但它对单个 Activity 起作用,而非整个任务。 此外,它还有可能会导致任何 Activity 停止,包括根 Activity。 设置为 true 时,Activity 仍是任务的一部分,但是仅限于当前会话。如果用户离开然后返回任务,则任务将不复存在。

7、Activity的启动模式

在AndroidManifest.xml文件中为Activity配置相应的launchMode属性可以设置Activity的启动模式,共如下四种模式:

  • standard
  • singleTask
  • singleTop
  • singleInstance
    接下来对四种启动模式进行详细分析。

7.1、standard模式

标准启动模式:
该模式下每次启动Activity都会重新创建Activity实例,在这种模式下谁启动了这个Actvitiy,那么这个Activity与被启动的Activity位于启动它的Activity的栈中。

7.2、singleTop模式

栈顶复用模式:
该模式下如果Activity已经位于栈顶,那么该Activity不会重新创建,同时它的OnNewIntent()方法会被调用,通过方法的参数可以取出其中的信息,并且在这种模式如果这个Actvitiy不位于栈顶,那么这个Activity依然会被重新创建。

7.3、singleTask模式

栈内复用模式:
只要Activity实例在一个栈中存在,那么再次启动该Activity时不会重新创建实例,并且系统也会回调其OnNewIntent()方法,并且该模式下有清除栈顶实例的效果,即会将与singleTask模式下的该Activity同一个栈中的栈顶的所有Activity实例全部出栈。

7.4、singleInstance模式

单实例模式:
单实例模式具备singleTask模式的所有的特性,此外具有此模式的Activity只能单独位于一个任务栈中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值