美文网首页
Activity的启动模式

Activity的启动模式

作者: Danny_yy | 来源:发表于2017-07-27 16:10 被阅读63次

    应用通常包含多个Activity,每个Activity均应围绕用户 可以执行的特定操作 设计,并且能够启动其他Activity。

    一个 Activity 甚至可以启动设备上其他应用中存在的 Activity。

    问题来了。Activity在哪里加载?Activity怎么启动其他的Activity?启动的过程中有什么加载模式?

    官方文档会有很详细的介绍。在这里,不妨看看这个思路来理解。

    在哪里加载


    1. Android中是使用Task(来管理活动的)。任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈)中。

    2. 通俗点来说,一个任务就是一组存放在栈里的Activity(活动)的集合,这个栈就是返回栈(BackStack)

    3. 栈是一种先进先出的数据结构。

    怎么启动


    Activity之间通过intent来进行通信。

    加载模式


    在AndroidManifest.xml中,通过给<activity>标签制定android:launchMode属性来选择启动模式。

    启动模式一共有四种:standard、singleTop、singleTask、singleInstance四种模式

    1. standard: 默认。
    • 系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。

    • 在这种模式下,每启动一个新的活动,它就会在返回栈中入栈,并处于栈顶位置。系统不管这个活动是否存在返回栈中,每次启动就会创建该活动的一个新的实例。

    1. singleTop
    • 在这种模式下启动活动时,如果发现返回栈的栈顶已经是该活动,则可以直接使用它,不会再创建该活动的实例。
    1. singleTask
    • 在这种模式下启动活动时,系统会首先在返回栈中,检查是否存在该活动的实例,如果发现已经存在,则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现。就会船舰一个新的活动实例。
    1. singleInstance
    • 在这种模式下启动活动时,会有一个单独返回栈来管理这个活动。不管是哪个应用来访问这个活动,都共用同一个返回栈。

    适用场景


    standard:

    这个基本不用说啦,其实大多数的时候都用它,我以前都是用intent各种跳转,跳转的时候把activity给finish()了,然后回退栈的时候在进行跳转 在finish() 这个好累呀。但作为菜鸟的我这样了很久。

    singleTop:

    1.适合接收通知启动的内容显示页面。

    • 比如新闻客户端收到了100个推送,你每次点一下推送他都会走一遍某个activiy(显示新闻只用一个activity,只是内容不同而已)的oncreate,onstart,代价就是创建了那么多的activity(不要以为只有推送,比如qq消息提醒)
      a 耗内存
      b, 走了100次的跳转动画 ,也是醉了。遇到app相互调用的时候很少用singletop。

    2.某些业务需求是自己的activity跳转到自己的。

    • 比如 歌曲搜索 你又不会用actionbar,toolbar,那就在activity上面弄个假的呗,搜索完了自己跳转自己现实搜索结果,那就直接用该模式,变化都在onNewIntent()里面对空间进行 赋值之类的。而且也没有跳转动画,人们以为这个activity没有动了,多high。

    Intent.FLAG_ACTIVITY_SINGLE_TOP 至于这个问题 它的作用等于singletop,他就管一次,除了activity自己跳转自己,还没想过哪里用,因为两个进程之间跳转 是不走onNewIntent()的。

    singleTask:

    (我记得第一次面试问的就是开100个activity如何快速关闭)

    • 适合程序开始的activity(频繁使用的主架构) 可以用于主架构的activity,(什么新闻啊,侧滑啊)里面有好多fragment,他一般不会被销毁,他可以跳转其他的activity 再回主架构 其他的就销毁呗
    • 浏览器的主界面。
      不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。(忘了从哪看得了) 比如登陆页面也是 入口 那就没太大必要,因为不经常用啊。finish()算了

    那么问题来了 如果你担心主架构用singleTask以后是否会有问题,那又想一下子删除好多activity,那就这样两个一起来 Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK 清除其他的activity而且只管一次 单独用的话我就没 实现过他说的功能 感觉比较坑,一起用最稳。

    singleInstance :

    他只做一件事情 他的任务栈好复杂呀,我的理解 他只做一件事情就够了 比如 闹钟里面 负责响的页面,打电话 接通的时候,地图显示的时候,他们都有一个特点 就是你做完这件事了都会返回到上一界面 而没有下一界面。 最好不要把 singleInstance 放到 中间的activity里面 a->b->c 如果 b是该启动模式, 那么 a ,c在一个栈里面 b 在一个栈里面,那你如果回退的话就悲剧啦,用户也会感觉奇怪。所以我理解 最好不要 让singleInstance 跳转到其他activity,当然也不绝对。

    注意:如果你每次都在oncreate()加载数据 (有变化的都算)那就没法用啦, 或者加载数据的地方在oncreate()和onNewIntent()全写一遍。因为你在后台的话很可能被杀死啦,那你预计让他走onNewIntent() 可能他就走了onCreate()了。

    参考文章

    相关文章

      网友评论

          本文标题:Activity的启动模式

          本文链接:https://www.haomeiwen.com/subject/hupnkxtx.html