Android开发艺术探索(研读笔记)——02-Activity的启动模式

android蓝牙开发的基本流程,android开发文档中文 这份体系学习笔记,适应人群:**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘。1、什么情况下使用 ViewStub、include、merge? 阅读详情

Android开发艺术探索(研读笔记)

02-Activity的启动模式

Activity 的 LaunchMode

复习一点:启动Activity时,系统会创造实例并把他们放入任务栈里,而任务栈是一种“后进先出”的栈结构。

Activity的四种启动模式:

  • standard:标准模式、默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。在这种模式下,某个Activity启动了一号Activity,那么一号Activity就运行在启动它的那个Activity所在的栈中。

  • singleTop:栈顶复用模式。如果新的Activity已经位于任务栈的栈顶,那么此Activity就不会被重新创建,同时它的onNewIntent方法会被回调,并且可以根据此方法的参数获得当前请求的信息。

  • singleTask:栈内复用模式。在这种单实例模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,系统也会调用其onNewIntent。

singleTask 的工作流程

  • singleInstance:单实例模式。这是一种加强的singleTask模式,除了具有singleTask模式的所有特性外,还加强了一点,那就是具体此种模式的Activity只能单独地位于一个任务栈中。

注:在任何跳转的时候,首先调用本Activity的onPause,然后跳转。如果被跳转的activity由于启动方式而没创建新的实例,则会先调用onNewIntent,然后按照正常的生命周期调用。

如:

  1. A→B,A:onPause;B:onCreate,onStart,onResume。
  2. A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。

一些具体问题与情况

  • 一:

首先要说明:任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态。

当在前台任务栈AB启动Activity D,而D正好是后台任务栈CD的栈顶。现在假设后台任务栈里的Activity的启动模式是singleTask,请求启动D,那么整个后台任务栈都会被切换到前台,直接占据前台任务栈的栈顶,即ABCD。如果之前请求启动的是C,那么就会变成ABC。

singleTask模式的Activity切换到栈顶会导致在它之上的栈内的Activity出栈。

  • 二:

TaskAffinity:任务相关性。标识一个Activity所需要的任务栈的名字。

adnroid:taskAffinity="com.dimon.task1"

默认情况下Activity所需要的任务栈的名字为应用的包名。

TaskAddinity

如何给Activity指定启动模式呢?

第一种方法:通过AndroidMenifest为Activity指定启动模式。
<activity
    android:name="com.dimon.SecondActivity"
    android:configChanges="screenLayout"
    adnroid:taskAffinity="com.dimon.task1"
    android:launchMode="singleTask"
    android:label="@string/app_name"/>
第二种方法:通过在Intent中设置标志位来为Activity指定启动模式。
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
区别
  • 优先级:第二种方法比第一种优先级高,两种都存在时,以第二种为准。
  • 限定范围:第一种无法设置FLAG_ACTIVITY_NEW_TASK标识,而第二种无法指定singleTask模式。

Acticity 中的一些比较常用的 Flags

  • FLAG_ACTIVITY_NEW_TASK

这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该启动模式相同。

  • FLAG_ACTIVITY_SINGLE_TOP

这个标记位的作用是为Activity指定“singleTop”启动模式,其效果和在XML中指定该启动模式相同。

  • FLAG_ACTIVITY_CLEAR_TOP

具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于他上面的Activity都要出栈。singleTask默认就具有这个标记位的效果。如果被启动的Activity采用了standard启动模式,那么它连通它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。

  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

具有这个标记的Activity不会出现在历史Activity的列表中,当某种情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性android:excludeFromRecents="true"。

IntentFilter的匹配规则

action的匹配规则

action的匹配要求Intent中的action存在且必须和过滤规则中的一个action相同。区分大小写。

categoryd的匹配规则

如果Intent中含有category,那么所以的category都必须和过滤规则中的其中一个category相同。

如果Intent中不含有category,那么也能匹配,因为系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以为了我们的Activity能够接收隐式调用,就必须在intent-filter中指定“android.intent.category.DEFAULT”。

data的匹配规则

规则与action相似。

<intent-filter>
  <data android:mimeType="image/*"/>
  ...
</intent-filter>

以上规则说明Intent中的mimeType属性必须为“image/*”才能匹配。虽然没有定义URI,但是还是得有默认值,URI的默认值为content和file。也就是说没有URI也得在Intent中的URI部分的schema必须为content或者file才能匹配。

intent.setDataAndType(uri.parse("file://abc"),"image/png");

如果要为Intent指定完整的data,必须调用setDataAndType方法,不能先调用setData再调用setType。因为这两个方法会彼此清除对方的值。源码如下:

public Intent setData(Uri data){
  mData = data;
  mType = null;
  return this;
}

而data的结构略微复杂,语法如下:

<data android:scheme="string"
  android:host="string"
  android:port="string"
  android:path="string"
  android:pathPattern="string"
  android:pathPrefix="string"
  android:mimeType="string"/>

data由两部分组成,mimeType和URI。

mimeType指媒体类型,例如image/jpeg、audio/mpeg4-generic和video/*等。

URI的结构如下:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
  • Scheme:URI的模式,比如http、file、content等。
  • Host:URI的主机名,比如www.baidu.com
  • Port:URI的端口号。
  • Path、pathPattern和pathPrefix:这三个表示路径信息,path完整路径信息;pathPattern也表示完整的路径信息,但是它里面可以包括通配符“*”,注意正则表达式;pathPrefix表示路径的前缀信息。

IntentFilter整合例子
<intent-filter>
  <action android:name="com.dimon.1"/>
  <action android:name="com.dimon.2"/>
  <category android:name="com.dimon.1a"/>
  <category android:name="com.dimon.2b"/>
  <category android:name="android.intent.category.DEFAULF"/>\
  <data android:mimeType="text/plain"/>
</intent-filter>

Intent intent = new Intent("com.dimon.1");
intent.addCategory("com.dimon.2b");
intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
startActivity(intent);
Some Tips

使用隐式方式启动Activity时,最好做一下判断,看看是否有Activity能够匹配我们的隐式Intent。

方法有两个:采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果他们匹配不了就返回null。

另外PackageManager还提供了queryIntentActivities方法:它不是返回最佳匹配的Activity信息而是返回所有成功匹配的Activity信息。

public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
public abstract ResolveInfo resolveActivity(Intent intent, int flags);

第二个参数我们使用MATCH_DEFAULT_ONLY这个标记位,这个标记位仅仅匹配那些在intent-filter中声明了<category android:name="android.intent.category.DEFAULT"/>这个category的Activity。
只要上述两个方法不返回null,那么startActivity一定可以成功。因为不含有DEFAULT这个category的Activity是无法接收隐式Intent的。


上一篇是整理昨天的笔记,这是今天的读书笔记。其实吧,说是笔记,其实只是在转载知识点,可以说也没办法加入的自己的理解。可以说,笔记里的知识对于我来说都是新的知识,所谓的撰写笔记只是为了加深自己的印象,方便以后查找。

之后可能还会整理一些项目的笔记,那些项目就可能会加上自己粗浅的理解了。

我是一名大四学生,正在找工作,如果您有Android方面的工作,欢迎联系我~

您在阅读我的笔记时,如果发现错误,渴望您及时指出谢谢

千里之行始于足下,我只是一个蹒跚学步的小娃娃,在巨人的肩膀上祈求能走得更远。


  • Good Luck!
Android开发之Theme、Style探索及源码浅析 看注释吧,这货有接近400多个item属性,这也就是我们Android关于Theme的开山鼻祖了,在我们自定义时其实来这看比去API查还方便呢(其实需要两个互相配合,一个查,一个看解释,哈哈),因为它里面定义了关于我们整个应用中文字样式、按钮样式、列表样式、窗体样式、对话框样式等,这些样式都是默认样式,它还有很多我们常用的扩展样式,譬如Theme.Light、Theme.NoTitleBar、Theme.NoTitleBar.Fullscreen等等,反正你要有需求来这里搞就行。看见name字段了吗? 阅读详情

相关推荐

Android Activity 功能代码实战:生命周期、跳转传参与启动模式避坑指南

Android 开发中,Activity 是承载界面与交互的核心组件,其生命周期管理、Intent 传参、启动模式选择直接影响应用性能与用户体验。理解 Activity 状态恢复机制与启动模式(如 singleTask)的行为差异,能有效避免数据丢失与返回栈异常。结合 ViewModel 与 onSaveInstanceState 的分工,可提升配置变更与进程重建的稳定性。在冷启动优化、页面跳转、转场动画等场景中,合理编排 Activity 功能代码尤为关键。本文围绕 Activity 生命周期、跳转传参、

weixin_34094282的博客 323

Android开发艺术探索(研读笔记)——01-Activity的生命周期

Android开发艺术探索(研读笔记) 01-Activity的生命周期 生命周期和启动模式以及IntentFilter的匹配规则分析。 Activity的生命周期分为两个部分 典型情况下的生命周期 异常情况下的生命周期 典型情况下的生命周期分析

Dimon、 930

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5912

Android Activity的四种启动模式(1)

当Activity全部退出时,系统会自动回收这个空栈。

2401_84121603的博客 1187

PDS联合Modelsim仿真报错(Error loading design) line6报错 -novopt已禁用 (全网最详细!!!!!)

发现这个文档是Pango自动生成的,也就是说每一次我们点击"Run Behavior Simulation"的时候,PDS都会自动生成一次这个./run_behav_simulate.tcl文件,所以就算我们这一次把这个文件修改了,我点击"Run Behavior Simulation"想让它再跑一次正确的仿真,它此时又重新生成了这个带有-novopt的错误tcl文件,仿真依旧不能成功。问题真的是出在这里,那我们修改这个./run_behav_simulate.tcl文件就好了,但事实并非如此!

weixin_74058783的博客 3191

大模型选型实战指南|教育行业:108个模型「闭卷考试」实测,这3类应用场景直接抄作业!

教育行业大模型选型必读 1.闭卷考试!独家评测集:用最新K12真题(小学-高中全学科)构建“闭卷考场”,108个模型同台竞技,数据污染率<5%(传统评测集污染率超60%) 2.价格透明对比:40元/M tokens的阿里系模型VS 2元/M tokens的字节系、腾讯系模型,谁更值? 3.四大选型禁区:>60元但得分<75的模型被列入不推荐名单(附避坑清单) 4.核心结论直出:教学核心环节必须用专用模型,90%场景用通用模型可降本50%+

easyllm的博客 1522

Andorid 开发艺术探索笔记(2)

这是一种单实例模式。Activity启动时要先查找栈里面是否有实例,如果有则将其调为栈顶,不创建新的实例,如果不存在则创建新的实例压入栈中。①S1栈中Activity为ABC,想启动D,则创建实例压栈,S1变为ABCD。②S1栈中为ABC,但D想要的栈为S2,S2不存在,所以S2和D同时创建并将D压入S2栈中。③S1栈中为ABCD,想在S1中启动B,则将CD出栈,S1栈中变成AB。(以上均在singTask模式下进行)

2401_84121627的博客 847

Abaqus仿真突然中断?手把手教你解决SIGTERM/SIGINT报错(附完整命令行方案)

本文深入解析Abaqus仿真中因SIGTERM或SIGINT信号导致进程意外中断的根本原因,并提供了一套完整的命令行解决方案。通过将作业提交方式从图形界面切换到命令行,并配合关键参数设置,可以有效避免因会话空闲超时或外部干扰引发的计算中断,保障长时间仿真任务的稳定运行。

devops8pract的博客 745

Android Activity的四种启动模式

相信很多人和我一样,在初学Android甚至初入职场的时候不了解Acticity的启动模式,或者为了面试刷题刷到了,但并不理解启动模式的作用,以及如何正确的使用启动模式而不是所有的都是用默认模式。Activity有四种启动模式,standard、singleTop、singleTask、singleInstance,默认启动模式是standard。

2301_79056696的博客 928

ESP32-P4开发板实战:从零配置VSCode环境到点亮MIPI-DSI屏幕(避坑指南)

本文详细介绍了ESP32-P4开发板在VSCode环境下的配置流程,包括SDK安装、idf_component.yml依赖管理,以及MIPI-DSI屏幕驱动的实现方法。通过实战指南帮助开发者避开常见配置陷阱,快速完成从环境搭建到屏幕点亮的全流程,适用于物联网和嵌入式开发场景。

pp12345的博客 740

YOLOv8改进---BiFPN特征融合

yolov8结合BiFPN进行改进

qq_41920323的博客 4523

最全Android 面试(一):说说 Activity 的四种启动模式,小红书测试开发面试题

Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2301_82244125的博客 1156

AI 实战篇 |基于 AI开放平台实现 人脸识别对比 功能,超详细教程【附带源码】

本篇文章来学习一下怎样使用 Unity实现简单地人脸识别 功能。 关于人脸识别,我们可以选择很多平台的SDK接入Unity来实现人脸识别的功能。

努力前行,总会成为自己心中的那道光 5万+

Android activity启动模式(1)

里面有一个列表,如果有多个实例,有可能导致用户看到的列表不一致,有的Activity需要经常启动,如果每次都创建实例,会导致占用资源过多,这些情况都可以使用singleTask模式,但启动singleTask模式的Activity会导致任务栈内它上面的Activity被销毁,有可能会影响用户体验,使用时要注意。,但一群人才能走的更远!只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

2401_84519929的博客 985

Maestro 薛定谔软件简单分子对接案例

#参考:Maestro 薛定谔软件使用:Maestro 薛定谔对接:sid=287811。

weixin_42357472的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 开发艺术探索笔记(1)

简单理解,启动Activty的请求会由来处理,然后它通过Binder向AMS()发送请求,AMS内部维护者一个并负责栈内的Activity的状态同步,AMS通过去同步Activity的状态从而完成生命周期方法的调用。在ActivityStack中的方法中的代码看出需要栈顶的Activity先onPause()后,新的Activity才会启动。

weixin_42179304的博客 1034

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android蓝牙开发的基本流程,android启动模式

这份体系学习笔记,适应人群:**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘。1、什么情况下使用 ViewStub、include、merge?

2401_84408404的博客 1104

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android混合开发lua,Android开发了解这些自然无惧面试

当我们的Activity上弹出Dialog对话框时,程序的生命周期依然是onCreate() —> onStart() —> onResume(),在弹出Dialog的时候并没有onPause()和onStop()方法。当我们在A中激活B时,A调用onPause()方法,此时B出现在屏幕时,B调用onCreate()、onStart()、onResume()。**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。

2401_84415708的博客 1111

读《Android开发艺术探索》后的面试题整理

之前听人说《Android开发艺术探索》这本书很适合做面试的复习资料,书中深入浅出的讲解了Android开发者进阶所必需掌握的各项知识点,而这些知识点也恰巧是我们面试时面试官最喜欢问的问题,于是我又重新系统的温习了一遍《Android开发艺术探索》这本书,总结了一些书中常在面试的过程中遇到的问题。

做更好的自己 2840

2024年安卓最全面试阿里Android研发岗,已拿到offer,这些知识点该放出来了(2),2024年最新拼多多面试官

我这里整理了一份完整的学习思维以及Android开发知识大全PDF。当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84562768的博客 995

安卓上机面试题,2024Android开发者学习路线,八年Android开发心路历程

我觉得JAVA部分大致上可以分为这几大块,细想一套代码,其实就是类和组合这些类,怎么组合其实就是设计模式。而类里面包含的其实就是基本数据类型和一些数据机构来存放这些基本数据类型或者类,然后就是JVM去怎么加载这些类。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。

2401_83977357的博客 1109

Android开发学习笔记之 获得Android 可使用内存

/ 得到ActivityManager// 创建ActivityManager.MemoryInfo对象// 取得剩余的内存空间// 获得总内存// /proc/meminfo读出的内核信息进行解释try {= null) {

asnmd1283的博客 655

2024(1),前方高能,Android黑科技保活实现原理揭秘

第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。他与View的区别(从源码角度,如加载,绘制等)。如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘。在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了。

m0_57473261的博客 829

Android面试:看似简单的Activity-生命周期问题,面试官会从哪些刁钻的角度考你呢?

Activity 的生命周期很基础而且也很重要,这也是面试常问的原因。相关的面试题可以涉及到 framework 的一些知识,平常在处理一些问题的时候最好不要只是打下日志看下结果,多钻进去源码看看,才能有更多收获,也记得更牢。作者:Android面试官链接:https://juejin.im/post/6844904199675871245最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析。

2401_87029184的博客 1071

具身智能 2026:启元人形机器人开发者生态的“安卓时刻”来了吗

一个贯穿全文的问题:人形机器人开发者生态,是否正从「封闭垂直」走向「开源平台化」?本文以开源底座的公开数据为标尺,盘点 SDK、URDF、仿真与技能分发的开放程度,并落回启元机器人的开源路径。所有关键数据均标注来源,文末附社区与学堂链接。

在北风吹起的时候加入我们的队伍 在秋雨到来的时候成为彼此的温暖 748
上一篇: Android开发艺术探索(研读笔记)——01-Activity的生命周期
下一篇: Android开发艺术探索(研读笔记)——03-Android中的IPC机制(一)
朴哲
博客等级 码龄11年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值