• 前言
  • 一、Activity的形态
  • 二、Activity的生命周期
  • 三、Android的4种加载模式
    • Intent Flag启动模式
  • 四、Activity间传递信息
    • Intent
  • 五、Activity现场保存状态
  • 参考资料

前言

Activity是Android中最常见的,也是最重要的应用组件,是提供用户完成指令的窗口。调用setContentView(View)方法来指定一个显示的界面,并采用Activity栈的方式来管理Activity。建立自己的Activity需要继承Activity基类。基类的种类有以下这些

一、Activity的形态

Activity拥有多种形态,在多种形态将进行切换,以此控制自己的生命周期

  • Activity/Running (运行状态)
    处于Activity栈的最顶层,处于前台进程,与用户进行交互

  • Paused (暂停状态)
    Activity失去焦点,处于可视进程。被一个非全屏的Activity或者透明的Activity放置在栈顶,Activity转化为Paused形态,失去与用户交互能力,所有状态信息成员变量仍保持,内存极低时被系统回收

  • Stopped (停止状态)
    被另一个Activity完全覆盖,进入Stopped形态,不可见,所有状态信息成员变量仍保持。处于后台进程

  • Killed (销毁状态)
    Activity被系统回收或者Activity从未被创建过。

二、Activity的生命周期

·

群英传中有说,Android的生命状态中有三个状态是稳定(Resumed、Paused、Stopped),其他状态是过渡状态

  • onCreate(Bundle savedStatedStatus)
    创建Activity时被回调,只会被调用一次
  • onStart()
    启动Activity时被回调
  • onRestart()
    重新启动时回调,也就是activity调用onStop()后,由后台进程转到前台进程,Activity再次变得可见时回调

  • onResume()
    onStart()后一定会调用onResume()。另外,当Activity调用onPaused()后,也就是处于可视进程,转到前台进程时调用onResume()

  • onPaused()
    暂停Activity时调用,也就是由前台进程转化为可视进程。另外提一点, 记录资源状态信息往往是在该方法中实现

  • onStop()
    Activity变为完全不可见,处于后台进程

  • onDestroy()
    Activity被销毁时调用,只会调用一次

三、Android的4种加载模式

Android采用Task管理多个Activity,一个App启动时,如果当前系统不存在该App的任务栈Task,则系统会创建一个Task,然后启动这个应用的第一个Activity,第一个Activity需要AndroidMainnifest中配置一下信息

            <intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>

正常情况中栈采用后进先出(Last In First Out)方式,先启动的Activity放在栈底,后启动的Activity放在栈顶。但我们可以采用不同的启动模式来打破这种情况。在AndroidMainifest文件中android:launchMode或Intent的flag设置不同的加载模式

  • standard模式
    默认的启动模式,每次为目标Activity创建一个新的实例,并置于栈顶。该模式不会启动新的Task

  • singleTop模式
    当将要启动的Activity已经位于栈顶时,系统不会重新创建一个新的目标Activity实例,而是直接复用已有的Activity实例,但如果目标Activity没有位于栈顶,则创建一个新的实例,与standard模式一致

  • singleTask模式
    Task中只含目标Activity唯一的一个实例,采用singleTask模式,系统检测栈中是否存在当前需要启动的Activity,如果存在,将目标Activity实例以上的Activity实例全部销毁,将目标Activity实例置于栈顶。
    有趣的是,启动的目标Activity实例已经存在于另一个Task中时,启动后,存在目标Activity实例的Task将一并切换到前台。如图

  • singleInstance
    采用该模式的Activity,启动它时会重新创建一个Task,并且该栈只包含该Activity。
    另外,当应用A启动了该Activity实例,如果应用B也要调用该Activity,则无须创建,两个应用共享该实例,常用于需要与程序分离的界面。

Intent Flag启动模式

  • FLAG_ACTIVITY_NEW_TASK
    使用一个新的Task来启动Activity,通常用于Service中启动,因为Service不存于Activity栈中

  • FLAG_ACTIVITY_SINGLE_TOP
    android:launchMode=”singleTop” 效果一致

  • FLAG_ACTIVITY_CLEAR_TOP
    android:launchMode=”singleTask” 效果一致

  • FLAG_ACTIVITY_NO_HISTORY
    当该Activity启动其他Activity后,该Activity消失

  • FLAG_ACTIVITY_CLEAR_TASK
    这个标记,将会导致任何用来放置该activity的已经存在的task里面的已经存在的activity先清空,然后该activity再在该task中启动,也就是说,这个新启动的activity变为了这个空task的根activity.所有老的activity都结束掉。该标志必须和FLAG_ACTIVITY_NEW_TASK一起使用。

四、Activity间传递信息

Activity之间的通信是必不可少的一部分,常用的通信方式有以下几种

  • Intent
  • 静态变量:适用于不可序列化的且简单的对象

  • 全局变量 及Application

  • Android系统剪切板

  • 本地化存储方式

    • SharedPreference
    • SQLite
    • File
  • onActivityResult回调监听
    通过重写该方法获取数据

  • Andorid组件

    • Broadcast方式
    • Service方式
  • EventBus
    EventBus 是一款针对Android的发布以及订阅事件总线,使用它可以很方便的进行信息传递

Intent

是目前最常见的信息传递方式,Intent 即意图:当一个Activity需要启动另一个Activity时,程序并没有直接告诉系统需要启动哪个Activity,而是通过Intent表达自己的意图。

通过Intent.putExtra方法可以将简单数据类型或可序列化对象保存在Intent对象中,然后在另一个Activity中使用getInt、getString等方法获得这些数据

Intent可传递的数据类型

  • 8中基本数据类型及其数组

  • String(String实现了Serializable)/CharSequence实例类型的数据及其数组

  • 实现了Plarcelable的对象及其数组

  • 实现了Serializable的对象及其数组(File在Java里也是类,在Android中实现了Serializable接口)

五、Activity现场保存状态

Activity调用了onPause和onStop()的进程仍然会保存在内存当中,但内存不足时,它所在的线程仍然会被终止。因此我们需要考虑保存Activity所有信息和状态,一般会采用两种方法实现

  • onPause()
    若向数据库中插入记录等,保存持久化数据的操作,适用于调用onPause()方法的时候实现

  • onSaveInstanceState()
    该方法适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等
    onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中,以保证该状态在onCreate(Bundle)或者onRestoreInstanceState(Bundle)(传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。
    执行顺序:在当前Activity被销毁之前会调用onSaveInstanceState,然后销毁当前Activity,创建新的Activity之后会调用onCreat方法之后会紧接着调用onRestoreInstanceState

参考资料

Android Activity原理以及其子类描述
Activity详细总结
Android群英传(徐宜生·著)
Android 消息通信之Activity间消息传递

Android四大组件之Activity相关推荐

  1. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  2. Android四大组件之Activity(第一篇-简单使用)

    Android四大组件之Activity(第一篇-简单使用) 前言 一.Activity是什么? 二.如何使用 1.继承 2.重写onCreate() 总结 文章目录 前言 一.Activity是什么 ...

  3. 重温Android四大组件(一)—Activity的生命周期

    前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了.但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心. 这里以& ...

  4. 第六课-Android四大组件之Activity

    Activity是Android四大组件之一,它是个控制类,主要控制界面的加载显示,用户交互处理,数据的获取,数据的传送等.在它的onCreate方法中的setContentView方法就是来加载一个 ...

  5. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  6. 【Android 四大组件之Activity】一文吃透Activity 生命周期

    作者:半身风雪 简介:在Android组件中最基本也是最为常见的四大组件: Activity Service服务 Content Provider内容提供者 BroadcastReceiver广播接收 ...

  7. android 4大组件相互启动,Android四大组件之Activity

    1.感性的认知Activity Activity是安卓的四大组件之一,它就像是一个容器,容器当中装了很多的Android布局,这些布局可以直接写在Activity所引用的xml布局文件当中,也可以通过 ...

  8. Android 四大组件之 Activity

    什么是 Activity? Activity 是 Android 的四大组件之一,是用户操作的可视化界面,它为用户提供了一个完成操作指令的窗口. 当我们创建完 Activity 之后,需要调用 set ...

  9. android四大组件之Activity(三)

    这是一篇关于android开发四大组件Activity部分的笔记之一,其中主要介绍Activity的生命周期以及一些实例等内容.这里所用到的开发工具是Android4.1. 目录 14.Activit ...

  10. Android四大组件之Activity(intent、ActivityThread)

    Activity 在Android的程序当中,Activity 一般代表手机屏幕的一屏.如果把手机比作一个浏览器,那么Activity就相当于一个网页.在Activity 当中可以添加一些Button ...

最新文章

  1. 调整数组顺序使奇数位于偶数的前面
  2. 【错误记录】Android Studio 编译报错 ( Cannot use connection to Gradle distribution . as it has been stopped. )
  3. 剑指offer之【调整数组顺序使奇数位于偶数前面】
  4. 关于VS无法启动程序,系统找不到指定的路径,最标准的回答
  5. 电中在线计算机应用基础二考试题目及答案,最新电大2015计算机应用基础作业2 答案.doc...
  6. 明日之后怎么跳过实名认证_明日之后宝箱达人活动怎么玩 明日之后宝箱达人可以开箱多少次...
  7. Acquiring lock on /*/*/.vscode-server/bin/f80445acd5a3dadef24aa20916 vscode远程linux 服务器无法建立连接
  8. 2013江苏计算机二级vfp试题,2013年3月全国计算机二级VFP真题
  9. 苹果首席芯片设计师离职 曾领导自A7以来所有芯片设计
  10. 部署和操作 Enterprise Library 加密应用程序块
  11. 求助,WIN10系统,我的推特用不了,提示网络没连接,其实我网络是好的,求大神指点,万分感谢!
  12. HTTP的SSL 证书安装
  13. 软考中级-软件设计师知识点与例题-1、计算机组成与结构
  14. 什么是期权股权?什么是期权股权原始股?
  15. MeanShift算法理解
  16. NLP 基础应用研究方向简介
  17. Ubuntu搭建团队文档协作在线平台
  18. vue组件通信(传值)
  19. LeetCode中等题之分数加减运算
  20. ATI显卡配置aticonfig和amdcccle全解

热门文章

  1. 从零实现一个在线相亲APP(缓解相亲尴尬的神器)
  2. decimal.TryParse int.TryParse DateTime.TryParse
  3. UBUNTU若干加速方法
  4. python中的元组和列表的核心区别
  5. 直播行业的未来增量:一边内容升级,一边驱动演艺
  6. c语言字体读取方式,请教文字识别与图象识别的方法
  7. 基于matlab人脸识别论文,毕业论文--基于MATLAB的人脸识别系统设计
  8. Unity官方案例同步学习-学习日记(二)——敌人AI寻路思路设计和部分方法
  9. [HTMLDOM]onmousedown、onmouseup 以及onclick事件触发顺序
  10. 使用vue-cli创建uni-app项目