学习Android Activity管理与控制

Android任务栈ActivityStack、TaskRecord、ActivityRecord关系 ActivityStack、TaskRecord、ActivityRecord关系 阅读详情


最近再做项目中很多的要用到Activity的控制,在查找资料的时候,发现了一篇介绍的很好的博客,感觉很有用,膜拜作者!


App程序中有很多Activity、你可以通俗的理解为把一个Activity看做是一个UI界面。在Andord系统中Activity是以堆栈<堆栈的特性:只有压入和弹出  先进后出>的形式存在。堆栈中的根Activity就是应用程序的启动Activity。而堆栈中最上方的Activity则是当前运行的/用户正在操作的UI Activity。

    也可以这样去理解:堆栈中保存的是Activity对象,如果一个应用中多次使用了一个Activity,那么就会使同一个任务中出现多个该Activity的对象。一个程序在运行、他所启动的Activity通常情况下<注意是通常情况下>在同一个堆栈中、这个也叫做任务栈<Task>。

    Activity和Task的关联: Activity在任务中的行为,受控于启动Activity的行为对象的标志位和清单文件中的<activity> 元素的属性的互相作用。

    

主要的行为标志有:

FLAG_ACTIVITY_NEW_TASK 

FLAG_ACTIVITY_CLEAR_TOP 

FLAG_ACTIVITY_SINGLE_TOP

..............等


主要的<activity>属性有:

launchMode 

taskAffinity 

allowTaskReparenting 

alwaysRetainTaskState

clearTaskOnLaunch 

finishOnTaskLaunch


下面将对每一个属性和标志一一介绍:

[虽然全是文字说明,稍有枯味、但只要你细细消化 相信使你对Activity栈的管理会进一步理解]

<activity>属性:

1、launchMode:Activity 4种启动模式  

     1>、standard: <默认启动模式>

           在任务栈中总是创建一个新的Activity实例

     2>、singleTop:

           在任务栈中如果有存在一个和新启动Activity相同的Activity正在栈顶则不再创建一个新的Activity,即不再调         用onCreate(),而是通过调用onNewIntent()方法。如果不存在栈顶,这时候就和standard一样创建一个新的             Activity实例,走onCreate()方法。

      3>、singleTask:

             ①设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性        值taskAffinity的Task存在;如果存在这样的Task,它就会在这个Task中启动,否则就会在新的任务栈中启动。        因此,如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。

            ② 如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经        存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity 实例会位于任务的Stack顶端中。

            ③ 在一个任务栈中只有一个”singleTask”启动模式的Activity存在。他的上面可以有其他的Activity。这点与singleInstance是有区别的。

       4>、singleInstance:

             在一个新的任务栈中启动,且该栈中有且只有他一个Activity实例、不允许有其他的Activity成员存在。

             永远他一个。


2、Android:taskAffinity: task亲和力

      通常来说一个程序内/任务栈中的Activity具有亲和力,也就是说具有相同亲和力的Activity默认属于同一个任务Task中,

     affinity决定两件事情——Activity重新宿主(从一个Task跳到了另一个Task中,新的Task就被称为重新宿主)的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。

     默认情况,一个应用程序中的所有Activity都拥有相同的affinity。你可以通过设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。如果不指定改activity到底属于哪个task,则可以将affinity设置为空字符串。如果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考<application>元素的taskAffinity特性)。应用程序默认的affinity的名字是<manifest>元素中设定的package名。

      注意:affinity只有在加载activity的Intent对象包含了FLAG_ACTIVITY_NEW_TASK 标记,或者当activity的allowTaskReparenting属性设置为“true”时才有效。


3、android:allowTaskReparenting:是否允许Activity跳转/更改Task

     用来标记Activity能否从启动的Task移动到有着相同affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时的那个Task里。如果这个特性没有被设定,设定到<application>元素上的allowTaskReparenting特性的值会应用到Activity上。默认值为“false”。

      一般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。当当前的Task不再显示时,你可以使用这个特性来强制Activity移动到有着affinity的Task中。典型用法是:把一个应用程序的Activity移到另一个应用程序的主Task中。


4、android:alwaysRetainTaskState:当按下Home主键将程序退回至后台运行,再回到前台时是否保留Task状态

     用来标记Activity所在的Task的状态是否总是由系统来保持——“true”,表示总是;“false”,表示在某种情形下允许系统恢复Task到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。

     一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。

然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。系统会为我们保持这些状态数据。


5、android:clearTaskOnLaunch:当按下Home主键将程序退回至后台运行,再回到前台时是否清除/移除除了跟Activity<启动Activity>之外的所有Activity。

     用来标记是否从Task中清除所有的Activity,除了根Activity外(每当从主画面重新启动时)——“true”,表示总是清除至它的根Activity,“false”表示不。默认值是“false”。这个特性只对启动一个新的Task的Activity(根Activity)有意义;对Task中其它的Activity忽略。

    当这个值为“true”,每次用户重新启动这个Task时,都会进入到它的根Activity中,不管这个Task最后在做些什么,也不管用户是使用BACK还是HOME离开的。当这个值为“false”时,可能会在一些情形下(参考alwaysRetainTaskState特性)清除Task的Activity,但不总是。

    假设,某人从主画面启动了ActivityP,并从那里迁移至Activity Q。接下来用户按下HOME,然后返回Activity P。一般,用户可能见到的是Activity Q,因为它是P的Task中最后工作的内容。然而,如果P设定这个特性为“true”,当用户按下HOME并使这个Task再次进入前台时,其上的所有的Activity(在这里是Q)都将被清除。因此,当返回到这个Task时,用户只能看到P。如果这个特性和allowTaskReparenting都设定为“true”,那些能重新宿主的Activity会移动到共享affinity的Task中;剩下的Activity都将被抛弃。


6、android:finishOnTaskLaunch:当按下Home主键将程序退回至后台运行,再回到前台时是否关闭/结束掉退回到后台之前的Activity.

     用来标记当用户再次启动它的Task(在主画面选择这个Task)时已经存在的Activity实例是否要关闭(结束)——“true”,表示应该关闭,“false”表示不关闭。默认值是“false”。
如果这个特性和allowTaskReparenting都设定为“true”,这个特性胜出,Activity的affinity忽略。这个Activity不会重新宿主,但是会销毁。



通过Intent设置的属性标识:

形式如下:

[java]  view plain  copy
  1. Intent intent = new Intent(SwitchActivity.this, ThredActivity.class);  
  2. intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);  
  3. startActivity(intent);  


1、FLAG_ACTIVITY_NEW_TASK

     在默认情况下,一个新Activity被另一个Activity调用了startActivity()方法,载入任务之中。并压入了调用者所在的堆栈。然而,如果传递给startActivity()的Intent对象包含了FLAG_ACTIVITY_NEW_TASK标记,系统会为新Activity安排另外一个任务。一般情况下,如同标记所暗示的那样,这会是一个新任务。然而,这并不是必然的。如果已经存在了一个与新Activity有着同样affinity的任务,则Activity会载入那个任务之中。如果没有,则启用新任务。

简言之:有相同affinity的任务,则压入该任务,否则创建一个新的任务。


2、FLAG_ACTIVITY_CLEAR_TOP

      如果intent将要启动的Activity已经存在于一个Task中,那么这个Task中该Activity上面的那些Activity都会被移除销毁,然后这个intent将会作为一个新的intent投递给目标Activity(目标Activity已经位于栈的顶端了)。

     这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任何运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,当从NotificationManager处启动一个Activity


3、FLAG_ACTIVITY_SINGLE_TOP

     如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。
     同 android: launchMode = “singleTop”


4、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

     如果设置,新的Activity不会在最近启动的Activity的列表中保存。


原作者地址:http://blog.youkuaiyun.com/janice0529/article/details/40905285

android选项卡的实现,子activity同时重绘选项卡 即将毕业,做android一年了,鼓足勇气原创一篇。知识面窄,道行尚浅,写的不好与不对的地方,亲们请给我指出来哈,请见谅。  demo源码下载地址:http://download.youkuaiyun.com/detail/hshuaijun55/4351317 首先,上张效果图,大家一看就知道是做什么的了。 现在咱们很多应用应该都会用到这个效果,网上也有很多文章有介绍如何做,在这儿我就不再 阅读详情

相关推荐

Android ActivityManager一些API介绍

Android中Java层的ActivityManager类中封装了很多API,可以供我们查询当前系统的很多信息,包括:内存、进程(Process)、任务栈(Task)、服务(Service)等的相关信息。 利用这些信息可以进行一些有用的判断,例如判断当前系统内存是否不足、指定Service是否在运行中。 (ActivityManager类封装了很多API方法供上层调用,具体负责管理Activity、Service等组件的是ActivityManagerService(AMS...

u013914309的博客 808

Android学习之 Activity堆栈管理与控制

App程序中有很多Activity、你可以通俗的理解为把一个Activity看做是一个UI界面。在Andord系统中Activity是以堆栈的形式存在。堆栈中的根Activity就是应用程序的启动Activity。而堆栈中最上方的Activity则是当前运行的/用户正在操作的UI Activity。     也可以这样去理解:堆栈中保存的是Activity对象,如果一个应用中多次使用了一个Act

小吕丶Code阶区 1万+

Android Studio五子棋小游戏开发:自定义View与Canvas绘制实战解析

安卓应用开发中,自定义控件是进阶的关键技能。通过自定义View绘制棋盘与棋子,能够深入理解Canvas绘图、触摸事件分发与界面重绘机制。一个完整的双人对战五子棋项目,不仅涵盖棋盘坐标换算、落子判定、胜负检测等游戏核心逻辑,还涉及悔棋、平局处理与Activity状态管理。这类工程实践常用于移动应用开发课程设计,帮助开发者掌握从界面绘制到交互反馈的完整闭环。针对编译环境、真机适配、刷新失效等高频问题,可提供切实可行的排查方案,并支持棋谱回放、简单AI等扩展改造,适合作为安卓入门到进阶的实战参考。

weixin_42531923的博客 298

Activity堆栈管理

task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中的,第二个activity压入第一个 activity所在的task栈。当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示。这样,从用户角度来看,这两个activity就好像是属于同一个应用程序的,...

余炜的博客 410

Java与Android开发大作业实践:源码解析与应用构建

本文还有配套的精品资源,点击获取 简介:此大作业项目包含Java和Android编程的源代码,旨在帮助学生或开发者通过实践深入理解Java和Android开发的关键概念。源码涉及Java面向对象编程、控制结构、异常处理、集合框架、输入输出流、多线程、IO与NIO、设计模式等核心Java知识点,以及Android的Activity生命周期、布局管理、Intent机制、数据绑定...

weixin_35696112的博客 1187

Android activity堆栈及管理实例详解

主要介绍了Android activity堆栈及管理实例详解的相关资料,非常不错,具有参考借鉴价值,对android activity堆栈相关知识感兴趣的朋友一起学习吧

Android 安卓栈管理Activity工具以及使用方法

引导 安卓开发中不可缺的,可以在Application初始化的时候建立,也可以创建一个单例来管理,下面是创建了单例模式的类来管理,给出了几个常用的,可以根据自己的业务需求再添加,注释有详细标明! 使用方法 在项目 BaseActivity 中 onCreate 方法中调用 addActivity 方法 在项目 BaseActivity 中 finish 方法中调用 removeActivity 方法 其余的方法应该在业务中调用,比如: 在输入完账号密码后登录进入首页后,调用 finishBeForAct

两行代码 踏踏实实de工作 2587

dify智能体:日志管理与标注功能详解

日志管理与标注功能是优化聊天助手、Agent、文本生成应用、Chatflow 和工作流等工具交互体验的关键。日志管理允许用户查看、修改和标注日志,帮助回顾和优化交互内容。用户可以通过点击👍或👎按钮快速标注满意度,标注后的日志可用于后续优化和分析。标注功能则支持用户对交互内容进行标记和调整,以提升模型输出质量。此外,用户还可以调整界面语言和时区设置,确保在熟悉的环境中操作。这些功能共同作用,显著提升了交互体验和模型性能。

zyx_bx的博客 2710

Android 获取栈最顶层Activity和Application Context解决方案

前言:和有梦想的人一起奋斗,那也就不会觉得孤独了。 以前开发都是在别人搭完框架的情况下进行开发,今天遇到一个很头疼的问题,想要在做一个很常见的功能,当接收到极光推送的消息,就在当前页面显示一个dialog通知用户账号在别处已经登录,需要重新登录。这个问题真的是难倒我了,因为极光推送过来的时候,我们并不知道用户操作到了哪一个Activity,而Dialog初始化的时候需要一个Activit

VickyWinner的博客 2万+

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 245

多节阶梯阻抗变换器工程设计的公式推导

  多节阶梯阻抗变换器工程设计的公式推导,仔细看此文,有点烧脑,所以碎片十分钟,收获一丢丢。   现在就来设计一个超宽带多节阶梯阻抗变换器,要求带内纹波符合切比雪夫分布。   其实,此文已经是省去了大量中间公式推导,只剩下精炼内容了。   阶梯阻抗变换器指标需求   假设现在有一项目需求分析结果是:做一个微带线超宽带阶梯阻抗变换器,指标如下:   从50欧变换到100欧;   回波损耗22dB;   功率容量:2W;   频率范围2~18GHz;   插损能做多少就多少,用30mil板厚.

wusuowei1010的博客 7806

[原]Android学习之 Activity堆栈管理与控制

[原]Android学习之 Activity堆栈管理与控制 App程序中有很多Activity、你可以通俗的理解为把一个Activity看做是一个UI界面。在Andord系统中Activity是以堆栈的形式存在。堆栈中的根Activity就是应用程序的启动Activity。而堆栈中最上方的Activity则是当前运行的/用户正在操作的UI Activity。     也可以这样去理

u013073227的专栏 2531

避坑指南:用逐飞开源库驱动MT9V03X摄像头时容易忽略的3个细节(附TFT显示优化技巧)

本文详细解析了在智能汽车竞赛中使用MT9V03X摄像头(总钻风)时常见的硬件连接、图像采集和TFT显示优化问题。重点介绍了逐飞开源库中容易被忽略的三个关键细节,包括电源管理、看门狗设置和中断优先级配置,并提供了针对IPS200和TFT180显示屏的优化技巧,帮助参赛队伍提升图像处理效率和显示质量。

study的专栏 743

Android-完全退出当前应用程序的四种方法

2. 任务管理器方法首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上3. 根据Activity的声明周期3. 我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志 Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

2401_84519718的博客 1970

Grafana企业版vs开源版:从安装到插件管理的完整对比实测(含离线部署技巧)

本文深入对比Grafana企业版与开源版在安装流程、插件管理和功能限制等方面的差异,特别针对离线部署场景提供实用技巧。通过实测数据源支持、权限管理等核心功能,帮助企业用户做出明智选择,同时详细介绍离线安装和插件签名验证等关键操作。

weixin_29313817的博客 104

小白的MatSWMM使用心路(二)——用matlab修改INP文件参数/使用matlab查找txt内容并修改多行内容

说是修改inp,但是里面的内容大部分还是讲怎么修改txt的……(?)。包含如何找到需要的参数(关键字)位置,以及修改那个位置的txt这样的内容。希望能帮助大家吧……Matlab你要多出好用的功能啊!

weixin_44276743的博客 4530

ActivityManagerService启动学习

ActivityManagerService启动学习 简介 学习android高级课程的时候遇到几个问题,就是如何启动一个app。activity与ActivityManagerService通讯流程?Activity究竟是什么? Activity究竟是什么? 个人理解是一个状态。当前页面处于什么状态。而绘制是通过WindowManagerService来进行。状态控制通过ActivityMana...

风炫灬梦想的博客 764

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4652

android热更新和热修复使用,详解系列文章

自我介绍一下,小编13年北京科技大学毕业,曾经在字节跳动待过,也去过vivo、小米等大厂,18年进入华为一直到现在。小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担,能在岗位上再创辉煌,步步高升!!。

2401_84902978的博客 996

JavaScript(JS)、ECMAScript(ES)和TypeScript(TS)

JavaScript、ECMAScript和TypeScript是现代Web开发中不可或缺的技术。它们各自具有独特的特点和优势,相互补充,共同推动着Web开发的发展。了解它们的概念、特点、应用场景和发展历程,有助于我们更好地掌握和使用这些技术,提高开发效率,实现更高质量和更可靠的Web应用。

u013558123的博客 1718

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从零学Android(五)、Activity的生命周期

当用户退出、进入或者在使用我们的app的时候,我们app中的Activity页面的实例对象会在它们的生命周期函数中转换。比如说:当我们的Activity是第一次启动的时候,它会展示在系统的最前端,并且获取到用户焦点。在这个过程中,当我们在建立Activity的用户界面和组件的时候,系统会调用Activity的一系列的生命周期函数。这个时候,如果用户打开了另外一个Activity或者进入了其它的AP

Coder_Jim的博客 1025

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android窗口管理服务WindowManagerService的简要介绍和学习计划

       在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架。事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响。在Android系统中,对系统中的所有窗口进行管理是窗口管理服务WindowManagerService的职责。在本文中,我们就将简要介绍WindowManagerService的职能以...

weixin_33730836的博客 479

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android开发初探

任何语言从初学到入门的过程其实就是掌握其规则的过程,其后的功能实现就是在她提供的规范内,想方设法达到自己的目的。就好像学开车,要熟悉各种交通指示灯、指示牌、指示线,以及车内各种表盘、按钮、手杆。这些都了如指掌之后,就可以开车从北京去上海。不论你挑哪种路线,都要遵循它的规范,并最终达到目的地,可能不同的是,

heiyun30318的专栏 809

Android开发者们跳槽面试,一定要看看这篇文章,并发编程挑战

上面算是一个简单面试前技术点的总结,东西很多,如果要从零开始掌握这些也是非常艰难的过程,唯有靠自己点点滴滴积累,别无他法。其实自己总结出这些东西并不难,难的是如何学、如何坚持、如何加固,每个人的学习和积累方式都不同,一定要找到自己的方式,什么是好的方式标准就是让自己可以牢记、快速记,牢记比快速记更重要,如何坚持是一种意志力上的考验,往往我们需要为自己找一些长期和短期的目标,激励自己不断的进步。包括我在内的大部分人都不是什么天才,唯一能让自己进步的方式就是脚踏实地的去干,相信越努力、越幸运!

2401_83947398的博客 707

Android基础之使用Fragment控制切换多个页面

Android官方已经提供了Fragment的各种使用的Demo例子,在我们SDK下面的API Demo里面就包含了Fragment的各种使用例子,需要看Demo的朋友,直接看API Demo那个程序就可以了,不用到处去找。里面分开不同功能,实现了不同的类 今天讲解一下Fragment的控制,主要是切换View和页面替换等操作。还有就是如何获取Fragment的管理对象,以及与Activit...

weixin_34368949的博客 137
上一篇: JAVA网络编程
下一篇: Android 状态保存 生命周期 onSaveInstanceState onRestoreInstanceState 方法
ProbuINg
博客等级 码龄14年 10粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值