热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android五大组件-Activity

Activity生命周期这是Androidapi中所提供的Activity生命周期图,此外Activity还有四种状态:-running:Activity处于栈顶,接收输入事

Activity生命周期

Activity生命周期图
这是Android api中所提供的Activity生命周期图,此外Activity还有四种状态:
- running:Activity处于栈顶,接收输入事件
- paused:Activity失去焦点(即Activity不处于栈顶但可见,不接收事件)。一种情况是其被非全屏的Activity占据(eg:Dialog弹框)再或者被透明的Activity占据。正常此时Activity所有成员变量,内存状态都还在(除非内存紧张)
- stoped:Activity完全被覆盖。正常此时Activity所有成员变量,内存状态都还在(除非内存紧张)
- killed:被系统回收掉,此时Activity所有成员变量,内存状态都不存在了
下面是Activity几个生命周期的几个关键方法
- onCreate():此时Activity尚不可见,根据setContentView读取根视图之后…
- onStart():此时Activity可见但还不能接收输入事件
- onResume():此时Activity可见且可接收输入事件
下面是Activity的几个常见场景的生命周期流转:
- 点击Home键:running->onPause->onStop
- 回到Activity:stoped->onRestart->onStart->onResume
- 退出Activity:running->onPause->onStop->onDestroy
- 横竖屏切换:(正常情况下,Activity会被销毁并重新创建)running->onPause->onStop->onDestroy->onCreate->onStart->onResume
- 锁屏、解锁屏:(正常情况下)锁屏onPause->onStop 解锁屏onRestart->onStart->onResume

横竖屏相关参数:

  • android:screenOrientation:
    “unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
    “landscape”:横屏显示(宽比高要长)
    “portrait”:竖屏显示(高比宽要长)
    “user”:用户当前首选的方向
    “behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
    “sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
    “nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了
  • android:cOnfigChanges=”orientation|screenSize”。设置该属性横竖屏切换时Activity不会销毁重建,会调用onConfigurationChanged让我们可以做布局切换等工作

Activity启动模式

  • standard:每次启动Activity都会创建Activity实例
  • singletop:当启动的Activity与栈顶Acitivity相同则不会创建新的Activity实例
  • singletask:当Activity栈中有相同的Activity,则将Activity之上的其他Activity出栈使其位于栈顶
  • singleinstance:独立一个Activity任务栈

Activity任务栈

正常情况下,一个应用只有一个进程,而一个进程只有一个Activity栈

Activity(杂)

  • onSaveInstanceState/onRestoreInstanceState:Activity很有可能被系统销毁的时候调用,用户点击back键或者主动销毁不调用。可以存储和恢复相关数据
  • 隐式启动:隐式启动会根据条件匹配所有合适的对象以供选择
    隐式启动需要在AndroidManifet.xml中设置Activity接收的intent-filter条件;然后startActivity的Intent中设置查找筛选条件

<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.DIAL"/>
<data android:scheme="tel"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
activity>
//筛选条件
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

配置Acitivity的intent-fliter
intent-fliter有三种属性(action、data、category);action表示意图,查找的时候需要要有一个action匹配即可;category表示动作类别,需要全部匹配方可;data表示与动作要操纵的数据,匹配一组即可。

其中data有一下四种类型:

  • android:scheme 用于指定数据的协议部分,如上例中的http部分
  • android:host 用于指定数据的主机名部分,如www.baidu.com部分
  • android:port 用于指定主机名和端口之后的部分,一般紧随在主机名之后
  • android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定

Activity启动过程

这里假设从Launcher启动一个全新的App,整个启动过程主要关系到三个进程:Launcher,AMS,新启动的App进程
下面是一个简化的过程
Activity启动过程简述
下面是一个较为详细的过程图(从system_server启动Launcher画起)
这里写图片描述
附上原文件(用亿图打开)

  • 当此Activity的实例已经存在,并且此时的启动模式为SingleTask和SingleInstance,另外当这个实例位于栈顶且启动模式为SingleTop时也会触发onNewInstent(),而不触发onCreate

推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
小宇宇宙2502862273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有