博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android初级开发笔记-- activity启动模式的学习(1)
阅读量:5990 次
发布时间:2019-06-20

本文共 1970 字,大约阅读时间需要 6 分钟。

第一次学习Android中一个很重要的概念,启动模式。文章记录的也只是一些入门知识,随着学习的深入还会有activity启动模式的学习(2)和(3)。 下面分三个小点说一下对启动模式的理解区别以及如何设置。

预备知识

(1)activity是以任务栈的方式进行管理的,栈是一种先进后出的数据结构,栈中的activity只能通过出栈和压栈的方式改变顺序。 (2)启动一个application的时候,系统会默认创建一个任务栈,默认启动的activity都在同一个任务栈中。当启动另一个应用,之前那个任务栈就会被移到后台,成为后台任务栈,而刚启动的那个任务栈就被调到前台,成为前台任务栈。在用户面前显示的始终是前台任务栈中的栈顶activity。

对四种启动模式的理解

Android里面说的启动模式其实就是activity的启动方式。 有下面四种

  • standard(默认)
  • singleTop(栈顶复用)
  • singleTask(栈内复用)
  • singleInstance(单例)

standard--系统默认的activity启动模式,不管此时任务栈中的情况如何,每次启动一个activity,系统都会创建它的实例,并将其置于栈顶。

singleTop--另外一种常用的启动模式,当启动一个activity时,系统会检查一下当前任务栈中是否已经存在该activity实例,如果已经存在,就通过onNewIntent获得该实例把它置于栈顶。如果没有。那么创建该activity实例后将其置于栈顶。

singleTask-- 当以这种模式启动activity的时候,需要指定其任务栈。 activityA启动activityB的时候,会先在系统寻找是否存在该栈。

  • 不存在,创建栈并创建activity实例置于栈顶。
  • 存在,则在栈中寻找是否有B的实例,若有,则就通过onNewIntent获得该实例至于栈顶。无则创建该activity实例后将其置于栈顶。

singleInstance--看到名字就会想到单例模式是吧~是的,确实也是这样的思想。为了充分利用activity实例达到极致,设置这个启动模式后,activityA启动activityB,会专门为activityB创建一个任务栈,并且创建activityB实例至于栈顶。该activity实例便可被系统内的应用共享。

总结

对于时不时想把某个activity展示在用户面前这件事,使用 默认:不管在不在栈顶,都创建(该栈中可能有多个实例)->栈顶复用:若在栈顶,则复用(该栈中可能有多个实例,但相对默认模式,少了点)->栈内复用:瞅瞅这个栈中有没有,有就用,没有就造一个(该栈中只有一个实例)->单例:直接自成一派,创个栈,只有这个activity一个实例并且在栈顶,不管哪个应用程序都能用(该应用程序上下文中只有一个实例)。 弄明白了这几种启动模式后,就需要根据实际情况决定使用哪种启动模式。

具体使用场景

由于本人目前对启动模式的使用比较少,后续有更多再补充。

  • 场景:使通知栏弹出Notification,点击Notification跳转到指定的Activity。 假设现在处于栈顶展示在用户面前的就是这个activity。如果是默认模式,则会再次打开当前的Activity。这样展示在用户面前的效果就会很奇怪。(看起来是闪了一下) 如果使用的启动模式是singleTop,就会避免这种现象的出现。

  • 场景:假设我们的程序中有一个Activity是允许其他程序调用的,我们想让其他程序共享这个Activity的实例。如果使用的启动模式是singleInstance,就可以解决这个问题。

如何设置activity的启动模式

一般有两种方式设置。

  • 在manifast文件中通过activity的launchMode进行设置。
  • 通过对启动该activity的intent设置标志位实现。

疑惑及解答

1.如何设置不同的任务栈?

2.当activityA以标准模式启动B的时候,B的实例被创建且处于activityA任务栈的顶端,那么这个时候B启动了A(standard)呢?

3.这两种设置方式有什么区别呢?常用的标志位有好几个,组合起来使用又有什么不同的效果呢?

这些个答案等我下一篇文章再继续介绍哈~敬请关注Android初级开发笔记-- activity启动模式的学习(2)~

作者介绍

  • 杨晓华:广州芦苇科技 APP 团队 Android 实习生

内推信息

  • 我们正在招募小伙伴,有兴趣的小伙伴可以把简历发到 app@talkmoney.cn,备注:来自掘金社区
  • 详情可以戳这里-->

转载于:https://juejin.im/post/5cf3f929f265da1b8d1605c5

你可能感兴趣的文章
Linq之延迟加载特性
查看>>
JVM查找类文件的顺序(转)
查看>>
ORACLE触发器具体解释
查看>>
高速排序
查看>>
atitit..sql update语法的词法分析,与语法ast构建
查看>>
Asp.Net 之 Web.config 配置文件详解
查看>>
jQuery extend() & jQuery.fn.extend(),插件编写
查看>>
table中的标题行冻结的简单实现
查看>>
LoadRunner压力测试心得总结
查看>>
GCD之线程挂起与恢复
查看>>
机器学习方法总结
查看>>
SVN-服务器搭建、apache2整合、eclipse使用
查看>>
注意Hibernate4在开发当中的一些改变
查看>>
作业:JavaScript(数组篇-poker)给我的徒弟出个题。。。记得早点写完,然后大家3人可以早点打牌了...
查看>>
enjoy dollar vs cash dollar
查看>>
What is the largest TCP/IP network port number allowable for IPv4
查看>>
MongoVUE 如何导出数据
查看>>
AngularJS快速入门指南02:介绍
查看>>
从零开始学Xamarin.Forms(二) 环境搭建、创建项目
查看>>
js 动态 activex 组件
查看>>