[Android] Inent启动参数分析

Android中有哪四种启动模式?

  1. **android:launchMode="standard"启动模式
    标准模式,**每次启动Activity都会创建一个新的实例,不管此前是否已存在该Activity的实例,Activity默认采用标准模式启动。
  2. **android:launchMode="singleTop"启动模式
    单顶模式,**如果要启动的Activity已经位于任务栈的顶部(即栈顶的实例),则不会创建新的实例,而是调用已存在的实例的onNewIntent()方法,如果要启动的Activity不在栈顶,仍会创建新的实例并将其置于栈顶。
  3. **android:launchMode="singleTask"启动模式
    单任务模式,**启动Activity时,会检查任务栈中是否存在相同的实例。如果存在,则将该实例之上的所有Activity实例移出栈,并调用已存在的实例的onNewIntent()方法,如果不存在相同实例,则会创建新的实例并将其置于栈顶。如果同时也使用了android:taskAffinity=".launchermodetest.leilei"代码,则代表会创建一个新的任务栈,将此activity以及后续基于此activity跳转的活动,都会存到这个任务栈中
  4. **android:launchMode="singleInstance"启动模式
    单例模式,**以单独的任务栈启动Activity,每个任务栈只允许存在一个实例,如果要启动的Activity已经存在于其他任务栈中,则会将该任务栈移至前台,并将该Activity实例置于栈顶,SingleInstance模式的Activity通常用于独立的、全局的功能
    假设应用程序的默认任务栈为”.leilei”,如果activity声明了这个启动模式,则会再次创建一个.leilei的任务栈,单独存放这个activity,此时系统上就存在两个.leilei的任务栈,和singleTask不同的是后续基于此activity跳转的活动,都不会存放到此activity的栈中,因为这个模式的任务栈只能有一个activity,当再次启动声明了singleInstace启动模式的activity,则会直接将此任务栈移动到前台,并调用activity的onNewIntent(Intent intent)
  5. android:taskAffinity=".launchermodetest.leilei"任务栈
    如果要另起一个任务栈,必须声明**android:launchMode="singleTask"启动模式或者android:launchMode="singleInstance"启动模式,**或者代码上调用intent.setFlags(Intent.*FLAG_ACTIVITY_NEW_TASK*);才会生效

Android中所有Intent Flags解析

  • FLAG_GRANT_READ_URI_PERMISSION

    用于在Android应用程序中启动活动(Activity)时指定权限,允许接收Intent中包含的URI所代表的内容进行读取,也就是赋予可以通过Uri获取另外应用资源的权限

  • FLAG_GRANT_WRITE_URI_PERMISSION

    同上,不过是将读取权限,改为写入的权限

  • FLAG_FROM_BACKGROUND

    用于在Android应用程序中设置Intent的启动标志,指示该Intent是从后台发起的,也就是用于从后台启动activity,FLAG_FROM_BACKGROUND标志在Android中是一个deprecated(不推荐使用)的标志,而且它的作用会依赖于具体的系统版本和设备。该标志可能已不再被广泛支持或具有相同的行为。因此,使用FLAG_FROM_BACKGROUND标志时需要注意其兼容性和可靠性,并且最好根据具体需求和目标平台做出适当的决策

  • FLAG_ACTIVITY_BROUGHT_TO_FRONT

    这个参数和FLAG_ACTIVITY_REORDER_TO_FRONT特别像,都是将存在于任务栈中的活动,挪动到栈顶(前台),不会重新创建,而是复用,和FLAG_ACTIVITY_REORDER_TO_FRONT不同的是:FLAG_ACTIVITY_BROUGHT_TO_FRONT会将目标活动上面所有的活动都弹出,而FLAG_ACTIVITY_REORDER_TO_FRONT并不会将上面的活动都弹出

  • FLAG_ACTIVITY_CLEAR_TASK

    这个flag要配合Intent.FLAG_ACTIVITY_NEW_TASK来使用,也就是当启动一个Activity(假设是活动名称为Activity-leilei)时,会将这个Activity所处的任务栈里面所有的Activity全部清空(弹出栈),记住是全部弹出栈,然后创建Activity-leilei,尽管该任务栈中已经存在此活动了,仍然不会调用onNewIntent()方法,因为我说了,是全部弹出栈

  • FLAG_ACTIVITY_CLEAR_TOP

    假设.leilei这个任务栈中有5个Activity(Activity1,Activity2,Activity3,Activity4,Activity5),而我们的目标Activity2在任务栈中倒数第二个,当我们再次启动Activity2的时候,则会将时该Activity之上的所有活动弹出,并重新调用Activity2的onCreate生命周期来创建应用,注意这里并不会调用onNewIntent()方法

  • FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

    通过此flag启动的activity,都不会在任务栈中保留(指的是此activity调用了onPause或onStop就会从任务栈中移除),再次进入此activity,则已经没有了

  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

    启动的活动将不会显示在最近使用的应用程序列表中,也可以通过xml去声明**android:excludeFromRecents="true"**效果是一样的,不过如果Activity声明里这个代码,后续通过此Activity启动的其他活动,都带有这个flag的效果,也就是针对于Task栈生效的,这个栈里的所有Activity都有这个效果,如果切换到其他任务栈,则不会带有这个效果

  • FLAG_ACTIVITY_FORWARD_RESULT

    假设我任务栈中有,Activity1/2/3/4/5,我想把Activity5的结果返回给Activity1,该怎么办?常规做法就是先把值返回给Activity5→Activity4→Activity3→Activity2→Activity1,然而声明了这个flag后,可以直接将结果返回给指定activity(Activity1),也就是在Activity4中去启动Activity5,并携带FLAG_ACTIVITY_FORWARD_RESULT即可

  • FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

    这个一般不需要我们手动设置,作用:如果Activity存在于后台任务栈中(也就是能在历史记录中找到这个Activity),那么再次启动这个活动时会默认加上这个flag

  • FLAG_ACTIVITY_NEW_TASK

    此flag的具体作用就是用于创建新的任务栈,创建任务栈一定要调用过android:taskAffinity=".launchermodetest.leilei"才会生效,也就是指定任务栈的名称

  • FLAG_ACTIVITY_NO_HISTORY

    一个应用程序会有多个Task(Task Stack管理着该应用的多个Task),控制Task是否移动到前台,或顶部,只有移动到前台和顶部才会给用户看到。而这个flag代表没有浏览历时,若按返回键,或者不可见了就会立即销毁此活动,再次回到应用程序上,此Activity已经被销毁(弹出栈)了,再近期任务中也是没有记录的。

  • FLAG_ACTIVITY_REORDER_TO_FRONT

    将指定的活动移动到当前任务栈的顶部,如果活动已经存在于任务栈中,它将被重新显示而不是创建新的实例,即会调用onNewIntent(Intent intent)方法。reorder的意思就是重新排序,将活动重新排序到顶部,所以并不会弹出目标活动之上的Activity

  • FLAG_ACTIVITY_SINGLE_TOP

    如果目标活动已经在栈顶,则不创建新的实例,而是使用现有的活动实例,也就是复用此Activity,会调用onNewIntent()方法和onRestart/onStart()方法,并不会执行onCreate()

  • FLAG_ACTIVITY_MULTIPLE_TASK

    多任务栈,可以用于一个应用内启动多个任务栈,并且一个Activity可以同时存在多个任务栈中,需要配合FLAG_ACTIVITY_NEW_TASK或者FLAG_ACTIVITY_NEW_DOCUMENT一起使用,需要自行管理生命周期

Android如何做到跨进程启动另外个应用

Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.example.touristproject","com.example.touristproject.MainActivity");
intent.setComponent(componentName);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

只要应用存在即可启动,flags是给启动的应用另外起一个任务栈(不和原始应用共享一个任务栈),并清空touristproject应用所在的任务栈

Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.example.touristproject","com.example.touristproject.MainActivity");
intent.setComponent(componentName);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

如果只带有FLAG_ACTIVITY_CLEAR_TASK标志,那么则代表原始应用和待启动的应用都处在同一个任务栈中(因为没有FLAG_ACTIVITY_NEW_TASK,默认复用caller的任务栈),也不会清空touristproject所在的任务栈,因为需要配合FLAG_ACTIVITY_NEW_TASK,clear任务栈才会生效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片加载错误,显示默认图片

方法一&#xff1a;在img标签里&#xff0c;添加onerror事件 <img class"imgcls-err" style"min-height:250px" src"../images/facerule.jpg" onerror"javascript:this.src ../images/facerule.jpg;this.οnerrοrnull" id"…

C++ 常量对象及常量成员函数

#include <stdexcept> #include <iostream>struct Vector2 {float x;float y;// 通过[0]或[1]访问x或y分量float& operator[](int index){switch (index){case 0: return x;case 1: return y;default:throw std::out_of_range("Invalid Vector2 index!&qu…

springboot和vue:十、vue2和vue3的差异+组件间的传值

首先用vue-cli创建一个vue2的项目。 vue2和vue3的差异 main.js的语法有所差别。 vue2是 import Vue from vue import App from ./App.vuenew Vue({render: h > h(App), }).$mount(#app)vue3是 import { createApp } from vue import App from ./App.vuecreateApp(App).…

Flask 进行 Web 开发时,常见的错误

ImportError: No module named ‘flask’ 错误描述&#xff1a; 这个错误表示 Python 找不到 Flask 模块。解决方法&#xff1a; 确保已经正确安装了 Flask 模块。你可以使用以下命令来安装 Flask&#xff1a;pip install flaskAttributeError: ‘module’ object has no attri…

Java虚拟机内存模型

JVM虚拟机将内存数据分为&#xff1a; 程序计数器、虚拟机栈、本地方法栈、Java堆、方法区等部分。 程序计数器用于存放下一条运行的指令&#xff1b; 虚拟机栈和本地方法栈用于存放函数调用堆栈信息&#xff1b; Java堆用于存放Java程序运行时所需的对象等数据&#xff1b…

学习笔记|串口通信的基础知识|同步/异步|RS232|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择&#xff1a;实现分时复用模式选择串口1模式1&#xff0c;模式1波特率计算公式 3.串口通信代码实现编写串口1通信程序…

前端 | AjaxAxios模块

文章目录 1. Ajax1.1 Ajax介绍1.2 Ajax作用1.3 同步异步1.4 原生Ajax 2. Axios2.1 Axios下载2.2 Axios基本使用2.3 Axios方法 1. Ajax 1.1 Ajax介绍 Ajax: 全称&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff0c;异步的JavaScript和XML。 1.2 Ajax作用 …

用pandas处理数据时,使变量能够在不同的Notebook会话页面进行传递,魔法命令%store

【需求来源】 在使用pandas时&#xff0c;有的时候我想将.ipynb文件分开写 其中一个写清洗数据代码另外一个写数据可视化代码 【解决方案】 但是会涉及到变量转移问题&#xff0c;这个时候我通常使用的方法是&#xff1a; 1、在清洗完数据后导出到本地 2、在文件后面增加当…

vue3+elementPlus:el-tree复制粘贴数据功能,并且有弹窗组件

在tree控件里添加contextmenu属性表示右键点击事件。 因右键自定义菜单事件需要获取当前点击的位置&#xff0c;所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置。 //html <div class"box-list"><el-tree ref"treeRef" node-key"id…

android 不同进程之间数据传递

1.handler android.os.Message是定义一个Messge包含必要的描述和属性数据&#xff0c;并且此对象可以被发送给android.os.Handler处理。属性字段&#xff1a;arg1、arg2、what、obj、replyTo等&#xff1b;其中arg1和arg2是用来存放整型数据的&#xff1b;what是用来保存消息标…

python+selenium实现UI自动化(入门篇)

一、基础准备。 python环境安装&#xff0c;参考&#xff1a;CSDN pycharm安装&#xff0c;参考&#xff1a;CSDN 谷歌浏览器驱动配置&#xff0c;参考&#xff1a;CSDN二、新建pycharm项目 截图中&#xff0c;上面是项目地址&#xff08;可以提前在指定位置创建文件夹&#xf…

20 个超级有用的 JavaScript 技巧,让你的工作更轻松

今天这篇文章&#xff0c;我将跟大家分享20个我自己收藏使用的JavaScript技巧&#xff0c;希望今天这篇文章里的内容能够帮助到你&#xff0c;让你的工作更高效&#xff01;更轻松&#xff01;我们现在开始吧。 1. 多条件 if 语句 将多个值放入一个数组中&#xff0c;然后调用…

Redis 主从复制及哨兵模式

目录 1 Redis 主从复制 1.1 主从复制的作用 1.2 主从复制流程 2 搭建Redis 主从复制 2.1 安装 Redis 2.2 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 2.3 修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 2.4 验证主从效果 3 Redis 哨兵模…

数据结构——排序算法(C语言)

本篇将详细讲一下以下排序算法&#xff1a; 直接插入排序希尔排序选择排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某写关键字的大小&#xff0c;按照递增或递减0排列起来的操作。 稳定性的概念…

horizontal image flip(Neon优化)

1、原始代码 这个代码非常简单,就是将同一行的像素进行反转,我们需要注意,这里的像素是RGBA,因此一个像素共32位 uint32_t line; // 1. For an image of width w and height h, for all lines in the image, do the following. for (line = 0; line < h; line++) {uin…

JAVA开发中常用RDMS

一、前言 JAVA的开发离不开数据库的支持&#xff0c;常见的有关系型数据库和非关系型数据库。java除了处理不依赖与数据库的通信技术。很多的java项目或者应用程序都需要建立在数据库的基础上。所以java开发早已经不是单纯的java开发&#xff0c;更多的是基于对数据的处理&…

一文教你如何快速备考云计算HCIE 3.0 !

大家好&#xff0c;在誉天实验辅导老师的耐心帮助下&#xff0c;本人在9月21日的云计算HCIE 3.0考试已顺利通过&#xff0c;很高兴有这个机会给大家分享备考的经历&#xff0c;希望对还在备考的同学能有一定的帮助。 备考准备 在云计算HCIE3.0的课程学习结束之后&#xff0c;就…

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项…

一款构建Python命令行应用的开源库

1 简介 当我们编写 Python 程序时&#xff0c;我们经常需要与用户进行交互&#xff0c;接收输入并输出结果。Python 提供了许多方法来实现这一点&#xff0c;其中一个非常方便的方法是使用 typer 库。typer 是一个用于构建命令行应用程序的 Python 库&#xff0c;它使得创建命令…

使用MATLAB进行傅里叶变换

1、定义 T1;% 周期0-1 N20;% 最大谐波 k-N:N;% -20:20——-20表示a_(20)e^(j*20*w0*t) N1length(k);%N141 % ceil(N1/2)21%即21是N1的中位数tlinspace(0,T,100); Ntlength(t); ttlinspace(-4*T,4*T,1024); Nttlength(tt);2、原函数 w02*pi/T; % 0-T xt(t>T/4).* 1.0; fig…