六. Activity启动模式
Task任务栈(ActivityTask)
Activity属于App进程,但是Task属于操作系统,Task里面的Activity可以是属于不同的App的,所以App之间是可以相互调用的.比如:App里面可以使用打电话、地图等.
当我们查看手机后台运行的程序,他们其实就是一个个任务栈Task,我们平时可能会把他认为是一个个App,其实不然.
我们可以通过adb命令来查看后台运行的任务栈Task,命令如下:
adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'
执行adb命令后,结果如下:
tangkundeMBP:project tangkun$ adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'Running activities (most recent first):TaskRecord{a29ed4d #1 A=com.huawei.android.launcher U=0 StackId=0 sz=1}Run #0: ActivityRecord{e1755d4 u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t1}Running activities (most recent first):TaskRecord{b552136 #18 A=com.tencent.mm U=0 StackId=14 sz=1}Run #0: ActivityRecord{34daea u0 com.tencent.mm/.ui.LauncherUI t18}Running activities (most recent first):TaskRecord{921c837 #17 A=com.tangkun.xiangxuestudy U=0 StackId=13 sz=1}Run #0: ActivityRecord{72fdf64 u0 com.tangkun.xiangxuestudy/.TKActivity t17}
Activity启动方式有哪些?
- 通过Launch启动,也就是点击桌面图标启动Activity (
创建) - 点击顶部通知启动Activity (
创建) - 第三方应用启动Activity,通过Scheme启动Activity (
创建) - 从后台的任务栈启动Activity (
恢复)
Activity的生命周期
成对出现的几个:
- onCreate/onDestory:创建和销毁
- onStart/onStop:用户是否可见
- onResume/onPause:用户是否可以操作
onCreate和onStart的区别?
- 可见与不可见的区别.前者不可见,后者可见
- 执行次数区别.onCreate方法只会在Activity创建时执行一次,而onStart方法在Activity切换以及按Home键返回桌面再切回应用的过程中会被多次调用.因此,Bundle数据的恢复在onStart中比onCreate中执行更合适.
- onCreate能做的事onStart其实都能做,但是onStart能做的事onCreate却未必合适做.如前面所说,setContentView和资源初始化两者都能做,然而像动画的初始化放在onStart中做比较好.
onStart和onResume的区别?
- 是否在前台.onStart方法中Activity可见但是不在前台,不可交互,而onResume方法Activity在前台.
- 职责不同.onStart方法中主要还是做一些初始化操作,而onResume方法,根据官方建议,可以做开启动画和独占设备的操作
onPause和onStop的区别?
- 是否可见.onPause时Activity可见,onStop时Activity不可见,但是Activity还在内存中
- 在系统内存不足的时候可能不会执行onStop方法.因此,程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好放在onPause中进行,但要注意不能台耗时.
onStop和onDestory的区别?
- onStop阶段Activity还没被销毁,对象还在内存中,此时可以通过切换再次回到该Activity,而onDestory阶段Activity被销毁掉了.
onNewIntent的生命周期
- 只对
singleTop、singleTask和singleInstance启动模式有效,因为standard每次都是新建一个Activity实例,所以不会执行onNewIntent方法; singleTop、singleTask和singleInstance,这三种启动模式下重复启动同一个Activity时,不会重新创建一个新的Activity实例,调用完当前Activity的onPause方法后,只会调用调用的这个Activity的onNewIntent和onResume方法,并且可以在onNewIntent方法中接收传递过来的Intent的数据;- 只对
startActivity生效,对于从Navigation后台切换回来的恢复无效.
Activity的启动模式
standard每个任务栈Task可以创建多个实例- 注意事项:
- 当从非Activity的context启动Activity时,比如:在Applocation中启动Activity时,需要带上new_task的flag;
Intent intent = new Intent(getApplicationContext(), TKActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplicationContext().startActivity(intent);- 如果从应用内启动standard的Activity,则他的taskAffinity就是App的build.gradle中的applicationId
- 注意事项:
singleTop每个任务栈Task的顶部只能创建一个实例- 注意事项:
- 如果栈顶已经存在要启动的Activity,我们再重复去启动这个Activity的时候,不会走onCreate和onStart生命周期去创建一个新的Activity实例,而只会走当前栈顶Activity的onNewIntent方法和onResume生命周期
- 如果栈顶已经存在要启动的Activity,我们在通过设置taskAffinity和FLAG_ACTIVITY_NEW_TASK去重复启动当前Activity时,并不会重新创建一个新的taskAffinity的任务栈,也只会走当前任务栈栈顶的Activity的onNewIntent方法和onResume生命周期方法
- 使用场景: 适合启动同类型的页面
- 接收到通知启动的内容显示页面
- 耗时操作返回页面
- 登录页面
- 注意事项:
singleTask在任务栈Task中只能创建一个实例,所以这个Activity上面的所有Activity都需要出栈- 注意事项:
- 首先检查当前任务栈Task是否存在启动的Activity.如果存在,则会清空启动Activity栈顶部的所有Activity;如果不存在,则会重新创建一个启动Activity的实例.
- 如果给这个启动的Activity设置了taskAffinity,当前栈中不存在要启动的Activity,则会重新创建一个任务栈,存放当前启动的Activity.
注意:这里不给启动的Activity设置Flag值为Intent.FLAG_ACTIVITY_NEW_TASK也会创建一个新的任务栈,也就是说Flag对singleTask没有影响.
- 使用场景: 适合作为程序的入口
- WebView页面
- 扫一扫页面
- 确认订单页面
- 付款页面
- 注意事项:
singleInstance只能创建一个实例,并且独占一个任务栈Task- 注意事项:
- 不论当前启动的Activity是否在任务栈中,都会重新创建一个任务栈给到启动的Activity,并且任务栈中只存放当前启动的Activity;如果我们重复启动一个Activity,也会为每一个启动的Activity创建任务栈,保证一个任务栈中只存放一个Activity.
- 如果我们没有给重复启动的Activity设置taskAffinity,虽然会创建多个taskAffinity相同的任务栈,名称是我们app的applicationId,但是我们在查看手机后台的程序时,只能看到一个应用程序,也就是说手机后台查看到的任务栈名称都不相同,不会展示相同任务栈名称的任务栈.
- 使用场景: 适合与程序分离开的页面
- 闹铃的响铃页面
- 来电页面
- 锁屏页
- 注意事项:
相关文章:
六. Activity启动模式
Task任务栈(ActivityTask) Activity属于App进程,但是Task属于操作系统,Task里面的Activity可以是属于不同的App的,所以App之间是可以相互调用的.比如:App里面可以使用打电话、地图等. 当我们查看手机后台运行的程序,他们其实就是一个个任务栈Task,我们平时可能会把他认为是一个…...
本机连接aws的ec2时报错:所选用户的用户密钥未在远程主机上注册
引言 由于工作的需要,所以需要去学习下AWS相关的知识,所以自己注册了一个AWS的账号去进行学习。 问题发现 按照启动ec2实例的步骤:选择镜像->选择系统配置->配置密钥对->配置安全组->设置存储卷大小->启动实例 在上述操作…...
谁看见我的猫照片了
今天分享一个可自由拖得动的图片效果样式。 先看效果: 谁看见我猫的照片了? 再上源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><st…...
数据结构与算法之深度优先算法详解
深度优先算法(Depth First Search,DFS)是一种常见的图形算法,它是一种用于遍历或搜索树或图的算法。在深度优先搜索中,我们首先探索一个子树的深度,然后再回溯到父节点,接着探索另一个子树的深度…...
C# 给winfrom窗体添加皮肤控件
如何快速给C# winform添加好看的皮肤C# Winform中窗体的美化 SkinEngine的应用 皮肤控件换肤素材包,IrisSkin2.dll皮肤素材资源下载 压缩包内一共有22种皮肤素材,使用说明:把控件拖到你的form上,只需一行代码,即可实…...
数据分析真的很火吗?真的有很多企业需要这样的岗位吗?求大佬指点。
“我是去年毕业的,因为疫情影响,整个就业环境都很不好,很多企业都裁员了。加上疫情三年基本都是玩过去,也没啥一技之长,就业就更难了。听说现在做数据分析的人很多,我身边的朋友都在转行做数据分析。 其实…...
100 个 Go 错误以及如何避免:9~12
协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【OpenDocCN 饱和式翻译计划】,采用译后编辑(MTPE)流程来尽可能提升效率。 真相一旦入眼,你就再也无法视而不见。——《黑客帝国》 九、并发实践 本章涵盖 防止 …...
用户/用户组管理
用户管理 * useradd 命令添加用户,会在/etc/passwd生成用户信息,信息分为7列,被6个冒号隔开 第一列 username (login name) 第二列 密码,但是该列已经被移除,用x表示,密码信息已经存放在了/etc/shadow文…...
如何进行TCP抓包调试?
网络调试工具——Wireshark Wireshark 是世界上应用最广泛的网络协议分析器,它让我们在微观层面上看到整个网络正在发生的事情。 Wireshark 本身是一个开源项目,所以也得到了很多志愿者的支持。同时,Wireshark 具有丰富的功能集,…...
分享一个国内可用的ChatGPT网站,免费无限制,支持AI绘画 - AI 百晓生
背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个AI爱好者,翻遍了各大基于ChatGPT的网站,终于找到一个免费!免登陆!手机电脑通用!国内可直接对话的C…...
API安全性的要素与开发人员必修课测试
一、API安全性的要素主要包括以下几点: 1.身份验证和访问控制:API应该通过身份验证来验证请求的源,确保只有授权的用户或应用程序才能访问API。这可以通过使用API密钥、访问令牌、OAuth令牌或其他身份验证机制实现。 2.数据加密:A…...
leetcode 651. 4键键盘
651. 4键键盘 中等 102 company 微软 Microsoft company 谷歌 Google company 亚马逊 假设你有一个特殊的键盘包含下面的按键: A:在屏幕上打印一个 ‘A’。Ctrl-A:选中整个屏幕。Ctrl-C:复制选中区域到缓冲区。Ctrl-V:…...
Python垃圾回收机制
Python 运行过程中会不停的创建各种变量,而这些变量是需要存储在内存中的,随着程序的不断运行,变量数量越来越多,所占用的空间势必越来越大,如果对变量所占用的内存空间管理不当的话,那么肯定会出现 out of…...
Grafana插件安装并接入zabbix数据源(03)
一、在线安装插件 如果不指定插件安装位置,则默认安装位置为/var/lib/grafana/plugins;插件安装后需要重启grafana-server 安装zabbix插件alexanderzobnin-zabbix-app # grafana-cli plugins install alexanderzobnin-zabbix-app 使用--pluginsDir指定安装路径 # grafana…...
简述 JavaScript 中 prototype
简述 JavaScript 中 prototype 这篇笔记主要捋一下这么几个概念: JS 的继承构造函数new 的作用及简易实现__proto__ & prototype同样的方法,class 和 prototype 中分别是怎么实现的 基础概念 JS 是通过 prototype chaining 实现继承的语言&#…...
一觉醒来Chat gpt就被淘汰了
目录 什么是Auto GPT? 与其他语言生成模型相比,Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大,它可以应用于各种文本生成场景,包括但不限于以下几个方面 Auto GPT的历史 马斯克说:“ChatGPT 好得吓…...
13款JavaScript图像处理库,建议收藏备用
pica: 一个在浏览器中调整图像大小,而不会出现像素失真,处理速度非常快的图片处理库,仓库地址https://github.com/nodeca/picahtml2canvas: 强大的使用js开发的浏览器网页截图工具,仓库地址https://github.…...
uniapp m3u8格式视频加载
uniapp一:mui-player:三方 h5 web app uniapp 使用 mui-player 插件播放 m3u8/flv 视频流_翘翘红的博客-CSDN博客 uniapp 开发的h5项目,需要播放m3u8/flv后缀的视频,网上有很多视频插件,但是样式和效果不尽如人意&am…...
iOS描述文件(.mobileprovision)一键申请
iOS描述文件(.mobileprovision)一键申请 在主界面上点击描述文件按钮。 新建ios描述文件 然后点击新建,然后输入描述文件名称,描述文件名称字符和数字,自己好辨识就可以。然后选择描述文件类型,再选择bundle ID,如果…...
进行性能压力测试的原因、目的和好处
性能压力测试是指在模拟高负载、高并发情况下对软件系统进行测试,以衡量系统在实际使用过程中的性能表现。这些测试可以为生产环境中的应用程序提供关键数据,并帮助开发人员从根本上了解系统的实际性能。在本文中,我们将探讨进行性能压力测试…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
