0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android Activity启动模式的详解

Dbwd_Imgtec 来源:未知 作者:李倩 2018-04-18 15:47 次阅读

1、任务栈(Task)

若干个Activity的集合的栈表示一个Task。

栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于保障用户体验,维护用户操作体验上的完整性。

例如:微信ActivityA 分享文章到QQActivityB,两个activity是存在于不同app中的,但是被系统放在一个任务中,分享后,用户按back键返回,可以返回到原来的微信Activity A中,这就确保了用户体验。

2、查看当前系统的任务栈

命令行中 -- > adb shell dumpsys activity

3、Activity 的相关属性

android:taskAffinity:是否定义了该属性,对接下来讨论到的singleTask影响甚大,如果设置了Activity的taskAffinity属性值,Activity将在TaskName为指定值的独立Task中启动,否则,将在原来的默认Task中。

android:allowTaskReparenting:主要作用是activity的迁移,程序A已经启动了若干个Activity,其中包含Activity1(这个Activity1拥有该属性),当程序B也要启动它的时候,其可迁移到程序B内。

android:alwaysRetainTaskState:操作系统会在程序长时间不会动的时候,清除Task状态,如果开启这个,系统会继续保持直到再次打开,只对根Activity生效(ABC,A是栈底,C是栈顶,只能对A即可)。例如微信在后台,当我们再次打开应用时,系统会判断是否已经存在以A为根Activity的栈,如果有,直接使用该栈,并显示栈顶的Activity。

android:clearTaskOnLaunch:用来标记是否在启动该Activity时,清除除根目录的其他Activity

android:exported:是否支持其它应用调用当前组件。默认值:包含有intent-filter 默认值为true(); 没有intent-filter默认值为false。

四种启动模式:

standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;

singleTop:如果该Activity位于任务栈栈顶,则不需要创建,复用实例并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中,其余情况都要创建Activity实例;(singleTop模式,只在当前任务栈中生效、startActivityForResult启动一个设置了singleTop的activity,singleTop模式将无效)

关于onNewIntent():根据文档知,当Activity的启动模式是singleTop或者使用FLAG_ACTIVITY_SINGLE_TOP这个标记启动新的Activity并且Activity栈顶就是待启动的Activity的时候,会调用原Activity的这个方法;例子:QActivity为栈顶复用模式,当Qactivity位于栈顶时,再次打开,onResume() -- >onPause() -- >onNewIntent() -- >onResume() 。当Qactivity不位于栈顶时,onNewIntent-- >onRestart-- >onStart-- >onResume(也就是说只要栈顶不是Qactivity ,都会创建新的实例,是Qactivity则重用不新建)。

singleTask:使用好栈内复用模式对taskAffinity属性的理解很重要。

存在相同taskAffinity属性值的Task:不存在实例,则新建Activity实例。如果存在则把当前实例中复用实例, 这个 Activity 启动并且清除顶部的 Acitivity ,通过标识 CLEAR_TOP。

taskAffinity属性值不一样的Task:在这个 Task 中新建这个 Activity 实例。

singleInstance:和singleTask差不多,唯一不同的是singleInstance Activity实例的Task只能存放一个该模式的Activity实例,例如Qactivity加载Wactivity都会被放入其它的Task中,如果存在与Wactivity相同affinity的Task,则在该Task内创建Wactivity。如果不存在,则重新生成新的Task并入栈。

常用Intent Flags:

FLAG_ACTIVITY_NEW_TASK:如果task中已经有了你要启动的activity的话,当前task会被带到前台(不管这个activity是否在前台,有可能activity上边还压有别的activity)。如果配合FLAG_ACTIVITY_NEW_MULTI_TASK,则无论什么情况都会创建新的Task,就成了类似 singleInstance 的情况了。如果配合 FLAG_ACTIVITY_CLEAR_TASK,则会先清空该栈,然后向栈中添加目标Activity,栈ID不变。

例如:Flag为FLAG_ACTIVITY_NEW_TASK,Qactivity(栈为LOL)启动Wactivity(栈为DOTA),接着启动Eactivity(栈为DOTA),Home回桌面。打开该应用,Qactivity启动Wactivity,Eactvity会出现在前台,因为它是整块栈启动(里面顺序不变)。

FLAG_ACTIVITY_SINGLE_TOP:相当于launchMode中的singleTop。

FLAG_ACTIVITY_CLEAR_TOP:与singleTask类似,但有极大区别,它会销毁目标Activity和它之上的所有Activity,重新创建目标Activity,并没有执行onNewIntent()。

tips:指定启动模式时,Flags的优先级大于launchMode,当两者都有时,以Intent Flag有效。

注意事项:

1、当目标的启动模式不为标准模式时,不要使用startActivityForResult去启动目标,容易出现你意想不到的结果。

例如:(大概意思,startActivityForResult相当于白设置,会返回一个取消的结果)

2、当Activity执行了onDestroy,没有执行finish,那么实例都还是存在栈里的。但Activity被finish掉了,则它会是新建实例重新入栈,不会按启动模式想的那样。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3935

    浏览量

    127349

原文标题:详解Android Activity启动模式

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    #硬声创作季 Android应用开发:Activity启动模式

    AndroidAct
    Mr_haohao
    发布于 :2022年11月02日 22:50:14

    Android系统与应用开发内容介绍

    并在设备上运行本实验通过IDE中启动模拟器并通过模拟器进行断点调试,并对项目的整体架构有简单的了解。 第二阶段 11.Android应用剖析(上)12.Activity 1)Activity
    发表于 07-13 14:03

    Android系统与应用开发培训班

    运用Android的安全模式。 要求 本课程面向希望把握3G历史性机遇,成为3G移动互联网紧缺人才,并拥有一年以上软件开发经验或计算机相关专业硕士学历(包括在读),同时具备Java语言基础的开发者
    发表于 03-23 14:12

    [资料分享]+Android从入门到精通

    1.2 Android简介1.2.1 Andriod的历史1.2.2 Andriod的未来1.2.3 Andriod平台的技术架构1.3 Android应用程序构成1.3.1 活动(Activity)1.3.2 意图
    发表于 09-26 09:53

    Android的Intent该怎么使用?

    Intent 是 Android 应用程序组件之间启动,通信的一个对象。举个例子,Android 中的页面 Activity 之间互相跳转,就需要通过 Intent 对象来完成。不止
    发表于 09-12 09:05

    迅为i.MX6Q开发板Android启动APP

    本文档将讲解迅为i.MX6Q开发板如何让 APP 在系统运行时自启动,我们先新建一个工程名为 autorun 的空工程,或者大家可以自行选择想要启动的 App 工程。我们要让 app 在开机之后自动
    发表于 04-08 14:33

    第13章Activity、Intent和Service系统结

    13.1 Java语言编程基础 13.2 Android应用程序组件 13.3 Activity 13.4 Intent 13.5 Service 13.6 对话框 13.7 Android 程序命周期
    发表于 04-11 14:44 0次下载

    Android开发手册—API函数详解

    Android开发手册—API函数详解
    发表于 10-17 09:01 13次下载
    <b class='flag-5'>Android</b>开发手册—API函数<b class='flag-5'>详解</b>

    基于Android开发手册—API函数详解

    基于Android开发手册—API函数详解
    发表于 10-24 09:06 18次下载
    基于<b class='flag-5'>Android</b>开发手册—API函数<b class='flag-5'>详解</b>

    如何进行Android中Task任务栈的分配

    只是针对Activity而言的。 Activity有不同的启动模式, 可以影响到task的分配 Task,简单的说,就是一组以栈的模式聚集在
    发表于 07-03 17:42 0次下载
    如何进行<b class='flag-5'>Android</b>中Task任务栈的分配

    androidActivity应用

    androidActivity应用(电力电子电源技术及应用课后答案)-androidActivity应用,有需要的可以参考!
    发表于 08-31 13:22 1次下载
    <b class='flag-5'>android</b>的<b class='flag-5'>Activity</b>应用

    android-Activity

    android-Activity(深圳普德新星电源技术有限公司怎样)-android-Activity,有需要的可以参考!
    发表于 08-31 15:51 1次下载
    <b class='flag-5'>android-Activity</b>

    Android开发—使用ActivityGroup来切换Activity和Layout

    Android开发—使用ActivityGroup来切换Activity和Layout(ups电源技术参数)-该文档为Android开发—使用ActivityGroup来切换Activity
    发表于 09-27 15:36 3次下载
    <b class='flag-5'>Android</b>开发—使用ActivityGroup来切换<b class='flag-5'>Activity</b>和Layout

    Activity初学乍练

    本节开始讲解Android的四大组件之一的Activity(活动),先来看下官方对于Activity的介绍:PS:官网文档:Activity
    的头像 发表于 04-01 22:28 1234次阅读
     <b class='flag-5'>Activity</b>初学乍练

    带大家探究Activity启动前的一项重要的工作—栈校验

    本文从一例业务中遇到的问题出发,以FLAG_ACTIVITY_NEW_TASK这一flag作为切入点,带大家探究Activity启动前的一项重要的工作——栈校验。
    的头像 发表于 04-19 09:36 602次阅读