Android 一次启动多个Activity (TaskStackBuilder)

新手必看:如何用R/qtl快速完成QTL定位分析(附实战代码) 本文为新手提供了使用R/qtl进行QTL定位分析的完整实战指南。内容涵盖从环境搭建、数据准备与清洗,到核心分析流程(包括遗传图谱计算、单QTL扫描、置换检验确定阈值)以及进阶结果可视化的全步骤。通过清晰的代码示例,帮助读者快速掌握这一数量遗传学关键分析技术,实现从数据到QTL峰值的完整分析闭环。 阅读详情

引言

在什么场景下我么需要一次启动多个Activity 呢?一般来说用的最多的还是notification。点击一个notification,启动App 内的某一个TargetActivity,在TargetActivity界面 按back button 或者其他方式 把TargetActivity finish掉后不会返回到Home Screen 或者上一个应用的screen.而是返回到App 的MainActivity.

在讲解如何一次启动多个Activity 之前,我们来试想一下,要是我们自己来实现这种效果,我们怎么做呢?也许我们会这样做:

  1. 在notification 的 pendingIntent 中 设置一个标志位,标识从启动的这个Activity 返回的时候需要启动另外一个Activity,并在PendingIntent中把要启动的Activity 的className 一并传过去。
  2. 在被notification 启动的Activity 中 重写onBack 方法,或者捕获back 事件来实现finish 自身的同时start 另一个我们所需要的Activity.
  3. 如果返回的层级比较多。比如D–>C–>B–>MainActivity。那就每次启动下一个Activity 的intent 中 包含下一个Activity finish 后要启动的再下一个Activity。

按照上面的方式的确可以做到这种效果,如果返回的层级不多,比如就一次,还好说,如果返回的层级多,想想都麻烦。事实上在Android 3.0 之前,是不支持一次启动多个Activity的。所以在Android3.0之前,要实现上面所得效果也只能用这种笨的办法(也许有更好的方式,没有去仔细研究过)。

幸运的是在Android 3.0 api 16 Google 提供了一个新的Api startActivitys(Intent [] intents),通过传入一个Intent 数组来一次启动多个Activity.

startActivitys

Launch multiple new activities. This is generally the same as calling startActivity(Intent) for the first Intent in the array, that activity during its creation calling startActivity(Intent) for the second entry, etc. Note that unlike that approach, generally none of the activities except the last in the array will be created at this point, but rather will be created when the user first visits them (due to pressing back from the activity on top).

This method throws ActivityNotFoundException if there was no Activity found for any given Intent. In this case the state of the activity stack is undefined (some Intents in the list may be on it, some not), so you probably want to avoid such situations.

意思就是把要启动的Activity的intent 按照先后顺序放到一个数组里面,这种启动方式有点类似于通过startActivity(Intent)启动数组中第一个Intent 对应的Activity,在第一个Activity 创建的过程中再startActivity(Intent) 数组中的第二个Intent 对应的Activity.但是和这种方式有一点不一样的地方就是startActivitys这种启动方式只有数组中最后一个Intent 对应的Activity 会执行OnCreate 方法。其他Intent 对应的Activity只有在用户第一看到他们的时候才会执行onCreate方法(用户按back button finish 掉在它上面的Activity 后)。为了更直观的感受一下,可以通过adb shell dumpsys activity 命令查看所有Intent 对应的Activity在 Task and Back Stack的具体信息:
这里写图片描述

TaskStackBuilder

要通过startActivitys 来启动多个Activity,首先就得构建一个Intent 数组,并且为每一个要启动的activity 设置好启动方式(通过flag 设置)。TaskStackBuilder就是干这个用的。TaskStackBuilder 不光会帮我们构建好要启动的Activity 数组并设置好activity的启动方式。并且还提供了一些封装好的api,比如PendingIntent getPendingIntent (int requestCode, int flags, Bundle options),startActivities, Intent[] getIntents ().

下面是一段发送一个通知启动Activity 的一段示例代码:

 public void onSend(View v) {

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("My notification")
                .setOnlyAlertOnce(true)// 如果更新通知(同一个通知id),true表示只有第一次有alert 响声,false,每次都有
                .setAutoCancel(true) // 点击通知后自动cancel
                .setContentText("Hello World!");


        // 有两种方式构建启动Intent 数组,



        //第一种:

        /**
         *  通过TaskStackBuilder,TaskStackBuilder.addNextIntentWithParentStack(nextIntent) 会把nextIntent 的父Activity
         *  以及祖先Activity 按照先后顺序添加的一个intent 数组中。可以通过TaskStackBuilder.getIntents()方法得到一个intent 数组,
         *
         *  通过TaskStackBuilder是如何得知nextIntent 的父Activity以及祖先Activity 的呢?
         *
         *  <activity
         *       android:name="com.example.app.ChildActivity"
         *       android:label="@string/title_child_activity"
         *       android:parentActivityName="com.example.app.MainActivity" > // api 16 开始支持
         *
         *
         *          // 兼容 api 4 ~ api 15
         *           <meta-data
         *           android:name="android.support.PARENT_ACTIVITY"
         *           android:value="com.example.app.MainActivity" />
         *   </activity>
         *
         *
         *  是如何告知是通过在 AndroidManifest 中 activity 的 android:parentActivityName (APi 16 提供的) 属性来确定其父Activity,
         *  在 API 4~ Api 16 通过    <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/>
         *  来确定其父Activity。
         *
         *  ------------------------------------------------------------------------------------
         *  其中需要注意的是,TaskStackBuilder 会为 Intent 数组中的第一个 intent 设置 如下  Flag:
         *
         *  Intents[0] = new Intent(intents[0])
         *  .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
         *  |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
         *  |IntentCompat.FLAG_ACTIVITY_TASK_ON_HOME);
         *
         *  设置了IntentCompat.FLAG_ACTIVITY_CLEAR_TASK后,如果task已经存在,并且task
         *  里面有还没被finish 掉的Activity (也就是说app 可能正处��foreground 也可能在background,
         *  那么在点击通知启动 目标Activity 的时候会清空 task 里面的所有Activity
         *
         *  设置了IntentCompat.FLAG_ACTIVITY_TASK_ON_HOME 后 从Intent 数组最后一个Activity 返回时直接进入到Launcher.
         *  比如说:你正在看电影,收到一个通知,点击启动后,然后一步一步返回,从最后一个Activity 返回时直接退到桌面Launcher 而不是之前的 电影app界面
         *
         *  --------------------------------------------------------------------------------------
         *
         *
         */


        Intent resultIntent = new Intent(this, ResultActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntentWithParentStack(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);


        // 第二种:

        /**
         * 自己手动构建一个Intent 数组。
         *
         *
         * 为了避免上面第一种方式出现的不管从什么地方点击启动通知退出app后都退到桌面已经清楚已存在task里面activity 的问题
         * 所以去掉了IntentCompat.FLAG_ACTIVITY_CLEAR_TASK 和 IntentCompat.FLAG_ACTIVITY_TASK_ON_HOME。
         *
         *
         * 增加了Intent.ACTION_MAIN 和  Intent.CATEGORY_LAUNCHER 是为了实现点击通知启动activity 后,再按Home键
         * 回到launcher 后,再点击app icon 启动app时直接把已存在的task从background 带入到 foreground 而不是在已存在
         * 的task的 顶上在启动一个 app 的启动activity(MainActivity),
         *
         *
         *
         *  --------------------------------------------------------------------------------------------------------
         *  比如下面是 没有增加 Intent.ACTION_MAIN 和  Intent.CATEGORY_LAUNCHER 时的效果 通过 adb shell dumpsys activity 获得。
         *  Task id #1091
         *    TaskRecord{eecd5e3 #1091 A=com.example.practice.startactivities U=0 sz=4}
         *    Intent { flg=0x10000000 cmp=com.example.practice.startactivities/.MainActivity }
         *    Hist #3: ActivityRecord{8798dc0 u0 com.example.practice.startactivities/.MainActivity t1091}
         *    Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.example.practice.startactivities/.MainActivity bnds=[73,1209][1006,2142] (has extras) }
         *    ProcessRecord{c099968 22272:com.example.practice.startactivities/u0a241}
         *    Hist #2: ActivityRecord{25ea551 u0 com.example.practice.startactivities/.ResultActivity t1091}
         *    Intent { cmp=com.example.practice.startactivities/.ResultActivity }
         *    ProcessRecord{c099968 22272:com.example.practice.startactivities/u0a241}
         *    Hist #1: ActivityRecord{63c00ea u0 com.example.practice.startactivities/.SecondActivity t1091}
         *    Intent { cmp=com.example.practice.startactivities/.SecondActivity }
         *    Hist #0: ActivityRecord{d26b5c7 u0 com.example.practice.startactivities/.MainActivity t1091}
         *    Intent { flg=0x10000000 cmp=com.example.practice.startactivities/.MainActivity }
         * ---------------------------------------------------------------------------------------------------------------
         *
         * 增加了Intent.ACTION_MAIN 和  Intent.CATEGORY_LAUNCHER 就是为了保持和 在Launcher点击app icon 启动app时Launcher
         * 为启动activity设置的intent一样。这也是为什么我们平常在使用app 时按home task 进入到background,回到Launcher 后,
         * 从Launcher 再次点击app icon 不会启动给一个新的而是把之前在后台的task 带入到foreground。
         *

         *
         */



        Intent secondIntent = new Intent(this, SecondActivity.class);
        Intent mainIntent = new Intent(this, MainActivity.class);
        Intent [] intents = new Intent[]{mainIntent,secondIntent,resultIntent};
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mainIntent.setAction(Intent.ACTION_MAIN);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        resultPendingIntent = PendingIntent.getActivities(this,0,intents,PendingIntent.FLAG_UPDATE_CURRENT);


        mBuilder.setDefaults(NotificationCompat.DEFAULT_ALL); // 设置默认铃声和震动
        mBuilder.setContentIntent(resultPendingIntent);
        mBuilder.setPriority(NotificationCompat.PRIORITY_HIGH);

        mNotificationManager.notify(mNotificationId, mBuilder.build());
    }

示例Demo 下载

产考资料:
Tasks and Back Stack

2026年软件测试职业院校技能大赛—ERP管理平台-采购入库模块Bug定位与查找 竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。 阅读详情

相关推荐

数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】

Mathematica(安装and激活、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例) Mathematica_11.3.0 安装教程 Mathematica11.3 激活 P1 笔记本 P2 入门方法 P3 基本计算 P4 基本图形 P5 创建互动模型 P6 利用数据 P7 演示 P8 完整实例

upward 12万+

Android TaskStackBuilder类

转载来源: https://www.jianshu.com/p/678e2322fd41 场景:当应用处于后台时,默认情况下,从通知启动一个Activity,按返回键会回到主屏幕。但遇到这样的需求,按返回键时仍然留在当前应用。类似于微信、QQ等点击通知栏,显示Chat页,点击返回会回到主Activity。 一 在MainActivity点击按钮开启一个服务,并将Activity退出。服务中子线程睡...

假装你是大灰狼的专栏 1191

基于STM32F103标准库与DMA的实时音频FFT频谱显示系统设计

本文详细介绍了基于STM32F103芯片与DMA技术实现实时音频FFT频谱显示系统的设计方法。通过标准库驱动和FFT算法处理音频信号,结合OLED显示屏实时绘制音乐频谱,涵盖硬件选型、核心原理、开发环境搭建及性能优化等关键步骤,为数字信号处理应用提供实用参考。

yellow的专栏 777

android同时打开多个Activity的方式(应用于启动页面广告等场景)

现在很多的App都有启动页面,很多产品经理都会把启动页面做成一个广告页面,那么有广告就会有跳转,这时,跳转到广告的页面之后,我们退出广告页面后,就应该是回到首页。那么这个怎么实现是最好的呢?如果你看到这里了,应该会想:这还不简单,在广告页面写个跳转到首页不就行了。但是如果我广告页面还有别的入口呢?你还会继续想:这样我做个判断就可以了呀。那么我广告页面有多个呢?这样继续下去是不是而非常不利于扩展性、不

熊大巍搬砖记 1万+

体素坐标(voxel_coors)在mmdetection3d中的理解

体素坐标(voxel_coors)在mmdetection3d中的理解

weixin_38362784的博客 4219

Autojs实战教程---番茄免费小说Apk文件和源码

邀请码:782383363 字节跳到的App,推荐给大家,还是值得用一用的。不废话直接代码。 代码是带UI的复制后可以直接使用。 "ui"; //#region UI var rootUrl = "http://114.115.220.1:91";//各位大神小弟自己的服务器别黑谢谢 var storaySign = "FanqieXiaoShuo0412326@163.com"; var woolStorage = storages.create(storaySign);//创建本地存储 var

zy0412326的专栏 2万+

Android知识点——TaskStackBuilder(类似于微信、QQ等点击通知栏)

场景:当应用处于后台时,默认情况下,从通知启动一个Activity,按返回键会回到主屏幕。但遇到这样的需求,按返回键时仍然留在当前应用。类似于微信、QQ等点击通知栏,显示Chat页,点击返回会回到主Activity。一在MainActivity点击按钮开启一个服务,并将Activity退出。服务中子线程睡眠3秒后,模拟弹出通知。点击通知栏,进入消息列表页后。点击返回按钮时,可见直接回到了桌面。并没有

pochenpiji159的博客 3404

后仿真中的必懂VCS仿真选项之initreg和deposit

后仿真中,我们常常对于没有复位寄存器和存储器单元,使用仿真选项之initreg和deposit,两种处理方式。今天做总结。请注意:请勿将两者进行同时使用。对于到底选取哪种方式,要结合实际的情况决断。但是,两者同时使用,会有冲突,得不到预期结果。

那么菜的博客 4331

Android知识点——TaskStackBuilder

积跬步,以至千里;积小流,以成江海。 场景:当应用处于后台时,默认情况下,从通知启动一个Activity,按返回键会回到主屏幕。但遇到这样的需求,按返回键时仍然留在当前应用。类似于微信、QQ等点击通知栏,显示Chat页,点击返回会回到主Activity。 一 在MainActivity点击按钮开启一个服务,并将Activity退出。服务中子线程睡眠3秒后,模拟弹出通知。点击通知栏,进入消息列表...

weixin_34146805的博客 194

如何在 Ubuntu 24.04 LTS 上安装 SSH 服务器?

Ubuntu是一个基于Debian的开源Linux操作系统,由Canonical Ltd.开发和维护。Ubuntu致力于提供用户友好、稳定且安全的操作系统环境,适用于个人用户、企业和服务器等不同场景。Ubuntu 24.04 LTS是Ubuntu发布的一个长期支持版本,LTS代表长期支持(Long Term Support)。这意味着Ubuntu 24.04 LTS将获得长达5年的安全更新和维护支持,使其成为企业和个人用户的理想选择。

网络技术联盟站 5888

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

TaskStackBuilder使用

TaskStackBuilder

浮生若梦 5051

实现基于 Python 和 xterm.js 的 Web 交互终端demo

前端 (HTML):使用 xterm.js 作为前端终端模拟器库。创建了一个 WebSocket 连接到 ws://localhost:8765,这与后端服务器的地址和端口匹配。监听 WebSocket 消息,并将数据写入终端。同时监听用户输入并发送到服务器。后端 (Python):使用 websockets 库来创建 WebSocket 服务器,监听端口 8765。使用 paramiko 库来创建 SSH 客户端并连接到指定的远程服务器。

u010674101的专栏 876

Android 点击通知栏跳转,使用TaskStackBuilder问题

在不给需要跳转的Intent设置action的情况下,点击通知栏进入二级页面IMDetailsAct,然后finish()返回MainActivity,实际回到了桌面,栈中没有MainActivity,导致直接finish()回到了桌面。经过测试不管是设置addParentStack、addNextIntent还是Activity的启动模式,都是直接回到桌面。直到参考文档给Intent设置了action。

懒猫的狮子倒影的博客 297

android 蓝牙通讯demo

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PendingIntent.getActivity创建两个Activity实例的问题

PendingIntent.getActivity使用时候遇到的问题

Mr_Tony的专栏 1948

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

关于TaskStackBuilder

TaskStackBuilder API level16(4.1) TaskStackBuilder可以构造一个合成的回退栈,主要用于跨任务导航,应用于Android3.0及新版本。 我们通常利用返回键导航app,而返回键是基于当前任务的导航,这种局部的导航只有将当前任务中所有Activity结束掉时才返回上个任务,若从当前app跳转到另一app时就涉及到不同任务的跳转,也就是从任务一跳转到...

weixin_30405421的博客 226

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TaskStackBuilder

默认情况下,从通知启动一个Activity,按返回键会回到主屏幕。但遇到这样的需求,按返回键时仍然留在当前应用。类似于微信、QQ等点击通知栏,显示Chat页,点击返回会回到主Activity实现方式一:private void showNotification() { NotificationManager manager = (NotificationManager) getSystemS

yubang3223111的专栏 509

Blog #153: Activity任务栈(Task Stack)

任务栈(Task)是一个Activity的集合,采用"后进先出"(LIFO)的栈结构。每个应用启动时,系统会为其创建一个任务栈。

时代我西的博客 764

Android Back回退按钮

上一节中讲了 up 按钮, up按钮是在UI中实现的。上一节中有时候还误称为 back。但是,真正的back按钮,其实是不需要再android UI中实现的,因为所有的android设备都有,(左下或者右下)一般来说,back按钮就是维护一个简单的回退栈,但是在某一些情况下,需要指明back按钮的行为,以达到最好的用户体验哪些情况下需要指定back按钮的行为非常典型 用户通过 通知,桌面组件,或者

薛昭君的博客 7017

Android 外部唤起应用跳转指定页面

转自:https://www.jianshu.com/p/1439c8bbc34bAndroid 外部唤起应用跳转指定页面 lovejjfg 关注2017.08.12 16:37* 字数 1561 阅读 5365评论 25喜欢 50通常有这么一个场景,就是分享内容到微信朋友圈等,然后点击内容中的某个按钮就可以唤起自家应用。这里要讲的也是使用 scheme 的方式去实现跳转,先捋一捋思路,首先如果要...

baicaizaiqingdao2009的博客 6985

# Android中的任务和返回栈总结

Android中的任务和返回栈任务栈的基础知识:任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中。为什么要用任务栈:为了记录用户开启了那些activity,记录这些activity开启的先后顺序,google引入任务栈(task stack)概念,帮助维护好的用户体验。如何查看当前系统的任务栈手机中 –> 长按ho

道哥的技术博客 5985

在打开多个Activity后退出程序的方法

不推荐: 1. finish()方法 每次打开一个Activity前都调用finish()方法 Intent intent = new Intent(BActivity.this,CActivity.class);   startActivity(intent); finish(); 这种方法按返回键就不好使了,不建议用。 2. killProcess

438

TaskStackBuilder and extras for the back stack

I'm trying to use TaskStackBuilder with notifications to create a back stack for the back button to go through. Normal flow of my app: Activity A is launched from the launcher. User selects an

卫晨的专栏 589

Android面试收集录1 Activity+Service

1.Activity的生命周期 1.1.首先查看一下Activity生命周期经典图片。   在正常情况下,一个Activity从启动到结束会以如下顺序经历整个生命周期:   onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()。   包含了六个部分,还...

SFC0511的博客 231

[wordpress搬家]Android 基础 — 状态栏

Google官方文档有关于Notification的专题 一个好的应用一般都至少用到一个Notification,这东西用着挺方便的,花一上午研究一下,未来总会用得到。 Notification分成两种,一般的(Normal View)和大的(Big View)。 大的(Big View)在Android4.1以后支持,与普通的区别在于多了一块区域(Detail Area),具体区别如下图所

promenade的专栏 293

android中深度链接的实现

在讲今天主题之前,不知道大家有没有遇到这种情况,产品经理要做这么一个需求,要求外部链接跳转到app页面?又或者指定页面或者带参数? 这里就涉及到一个深度链接的概念,首先我们从第一步开始 ###注册事件监听 这里需要使用到 Android Activity中的 ,现在可以创建一个解析跳转的 Activity,名字随便取了,然后需要在 Manifest 文件中配置具体的 <intent-f...

u013285894的博客 1185
上一篇: Vim YouCompleteMe Mac OS C family 系统库函数不能自动补全
下一篇: Java 中字段和变量的的区别(Fields vs Variables in Java)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮克桃在写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值