前言

在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题。Android有四种启动模式,分别是standard,singleTop,singleTask,singleInstance。下面分别简单的介绍下这四种启动模式的作用。

standard

Android 默认的一种启动模式。不需要为activity设置launchMode。这种启动模式简单的来说就是当你startActivity的时候,他就创建一个。

singleTop

这种模式模式从字面意思就能看得出来,就是当前的activity处于栈顶的时候,当你startActivity当前的activity的时候,它不会创建新的activity,而是会复用之前的activity。举个例子,startActivity了一个ActivityA,ActivityA又startActivity了ActivityB,当在ActivityB再次startActivity一个ActivityB的时候,它不会创建一个新的ActivityB,而是复用之前的ActivityB。

这里需要注意的是,只有当前的activity处于栈顶的时候才管用。举个例子:startActivity了一个ActivityA,ActivityA又startActivity了ActivityB,ActivityB又startActivity了ActivityA,那么ActivityA还是会重新创建,而不是复用之前的ActivityA。

singleTask

单一任务。意思就是说当前的activity只有一个实例,无论在任何地方startActivity出来这个activity,它都只存在一个实例。并且,它会将在他之上的所有activity都销毁。通常这个activity都是用来作为MainActivity。因为主页只需要存在一个,然后回到主页的时候可以将所有的activity都销毁起到退出应用的作用。举个例子,startActivity了一个ActivityA,ActivityA的启动模式为singleTask,那么在ActivityA里startActivity了一个ActivityB,在ActivityB里startActivity了一个ActivityC。此时在当前的任务栈中的顺序是,ActivityA->ActivityB->ActivityC。然后在ActivityC里重新startActivity了一个ActivityA,此时ActivityA会将存在于它之上的所有activity都销毁。所以此时任务栈中就只剩下ActivityC了。

singleInstance

这个模式才是重点,也是比较容易入坑的一种启动模式。字面上理解为单一实例。它具备所有singleTask的特点,唯一不同的是,它是存在于另一个任务栈中。上面的三种模式都存在于同一个任务栈中,而这种模式则是存在于另一个任务栈中。举个例子,上面的启动模式都存在于地球上,而这种模式存在于火星上。整个Android系统就是个宇宙。下面来详细介绍一下singleInstance的坑。

singleInstance之一坑

此时有三个activity,ActivityA,ActivityB,ActivityC,除了ActivityB的启动模式为singleInstance,其他的启动模式都为默认的。startActivity了一个ActivityA,在ActivityA里startActivity了一个ActivityB,在ActivityB里startActivity了一个ActivityC。此时在当前的任务栈中的顺序是,ActivityA->ActivityB->ActivityC。照理来说在当前ActivityC页面按返回键,finish当前界面后应当回到ActivityB界面。但是事与愿违,奇迹出现了,页面直接回到了ActivityA。这是为什么呢?其实想想就能明白了,上面已经说过,singleInstance模式是存在于另一个任务栈中的。也就是说ActivityA和ActivityC是处于同一个任务栈中的,ActivityB则是存在另个栈中。所以当关闭了ActivityC的时候,它自然就会去找当前任务栈存在的activity。当前的activity都关闭了之后,才会去找另一个任务栈中的activity。也就是说当在ActivityC中finish之后,会回到ActivityA的界面,在ActivityA里finish之后会回到ActivityB界面。如果还想回到ActivityB的页面怎么办呢?我的做法是,在ActivityB定义一个全局变量,public static boolean returnActivityB;界面需要跳转的时候将returnActivityB=true;然后在ActivityA界面onstart方法里判断returnActivityB是否为true,是的话就跳转到ActivityB,同时将returnActivityB=false;这样就能解决跳转的问题了。不过感觉还不是很好,如果有更好的方法,欢迎大家给我留言告诉我一声。

singleInstance之二坑

此时有两个个activity,ActivityA,ActivityB,ActivityA的启动模式为默认的,ActivityB的启动模式为singleInstance。当在ActivityA里startActivity了ActivityB,当前页面为ActivityB。按下home键。应用退到后台。此时再点击图标进入APP,按照天理来说,此时的界面应该是ActivityB,可是奇迹又出现了,当前显示的界面是ActivityA。这是因为当重新启动的时候,系统会先去找主栈(我是这么叫的)里的activity,也就是APP中LAUNCHER的activity所处在的栈。查看是否有存在的activity。没有的话则会重新启动LAUNCHER。要解决这个方法则是和一坑的解决办法一样,在ActivityB定义一个全局变量,public static boolean returnActivityB;在oncreat方法将returnActivityB=true;然后在ActivityA界面onstart方法里判断returnActivityB是否为true,是的话就跳转到ActivityB,同时将returnActivityB=false;这样就能解决跳转的问题了。

总结

Android的启动模式如果利用的好,还是可以解决很多问题的。启动模式还是值得好好的研究一下的。欢迎各位指教出错误,共同学习。

原文:https://www.cnblogs.com/Im-Victor/p/9656471.html

android singleinstance home,Android启动模式之singleinstance的坑相关推荐

  1. android的四种启动模式,(转)彻底弄懂Activity四大启动模式

    原地址:https://blog..net/mynameishuangshuai/article/details/51491074 最近有几位朋友给我留言,让我谈一下对Activity启动模式的理解. ...

  2. Android四大组件和启动模式(面试总结)

    一.Android四大组件详解 Android四大组件分别为Activity.Service.Content Provider.Broadcast Receiver. 1.Activity (1)一个 ...

  3. Android启动活动用什么方法,Android中活动的启动模式

    自从跟某Android群里的小伙伴们说了"本皮卡丘要开始写文章了"之后,有时候皮卡丘在群里愉快得水着水着就有人冒出一句"皮卡丘你怎么还在水,文章呢?"吓得我整个 ...

  4. 由Actvity启动模式之SingleInstance引起的坑的反思

    以前对于Activity的启动模式只限于文字说明理解的层面,但最近的一个问题让我对启动模式有了更深的了解. Activity有四大启动模式:standard,singleTop,singleTask, ...

  5. Android中四种启动模式,最容易理解的小白教程

    说起Android中的启动模式,其实是个很基础的内容,谁都知道是4中启动模式,没错分别是以下四种: 1,standard 2,singleTop 3,singleTask 4,singleInstan ...

  6. android中活动的启动模式

    活动的启动模式 1.standard 2.singleTop 3.singleTask 4.singleInstance standard为默认的活动启动模式(无论活动是否在栈顶,都会创建一个新的活动 ...

  7. Android Activity Launch Mode 启动模式详解

    简介 android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题. 它是 Androidmanifest.x ...

  8. Android 基础 —— 活动的启动模式

    活动的启动模式来说应该是个全新的概念,在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式.启动模式一共有四种,分别是standard.singleTop.singleTask 和singl ...

  9. Android中Activity的启动模式和使用场景

    一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...

最新文章

  1. 沃森世界研讨会前瞻:AI服务 了解客户情绪
  2. 死磕算法!35 篇算法设计实例+6 本必读书打包送你
  3. Vivado中ASYNC_REG命令讲解
  4. 【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现
  5. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...
  6. 从零开始学android编程_小白也能学得会!谷歌推出免费的Kotlin和Android开发课程...
  7. 支持商用吗_可商用的插画素材 | 美翻了
  8. C++学习之路 | PTA乙级—— 1070 结绳 (25 分)(精简)
  9. 标记分布学习与标记增强
  10. 指数随机变量 泊松过程跳_如何深刻的理解随机变量
  11. 关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
  12. PL/SQL 12.0配置连接远程Oracle数据库
  13. 非IT专业大学生对erp的思考
  14. cad设计师证书怎么考
  15. 《数学分析(上)》重要概念复习
  16. XML基础复习[整理][转载]
  17. java---集合类---ArrayList类
  18. linux查看网络连接命令,linux查看网络链接状况命令之-netstat
  19. 旷视科技 CVPR部分文章
  20. R | failed to load cairo DLL

热门文章

  1. AliSQL开源Sequence Engine
  2. leetcode 785. Is Graph Bipartite? | 785. 判断二分图(DFS,地图着色)
  3. 【面试】Java面试常见问题汇总(不含答案)、面试指导学习笔记
  4. 【Python】RotatingFileHandler:log日志文件自定义大小+滚动输出
  5. 小师妹学JavaIO之:File copy和File filter
  6. linux性能优化--cpu篇
  7. 在Java语言里 ==和equals的区别
  8. c++堆栈溢出怎么解决_c语言进阶:堆栈原理揭秘
  9. read-only file system怎么改权限_“我就退出家长群!怎么了?”压垮成年人仅需一个“家长群”上热搜?...
  10. Leecode01. 两数之和——Leecode大厂热题100道系列