2019独角兽企业重金招聘Python工程师标准>>>

预备知识

启动模式

  standard模式(默认):只要创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。

  singleTop模式: 如果激活的Activity实例处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

  singleTask模式: 

        1. 寻找相同taskaffinity的Task,如果没有寻找到,则新启动一个Task,并且把该Activity放置到底部

        2. 如果存在相同的taskaffinity,那么再查询TaskStack中是否存在已经实例化的Activity,如果存在,则清空该Activity上面的所有Activity,最后调用

      newIntent(), 否则新创建一个Activity放入Task中

  singleInstance模式: Activity单独在一个taskStack中。如果已经存在则调用newIntent(),否则新创建一个放入单独的taskStack中。

onActivityResult

在开发中经常会使用onActivityResult,来处理Activity之间的数据返回,使用该方法,有几个关键点:

1.  传递数据的时候,两个Activity必须在同一个Task Stack中,所以最好保证两个Activity都使用standard的启动模式。

2.调用startActivityForResult的时候,requestCode必须大于0。

3.返回的时候,注意使用setResult来设置返回值,且统一使用RESULT_OK等标准代码点来设置执行状态

INTENT FLAG

  FLAG_ACTIVITY_NEW_TASK : 如果taskaffinity指向的TaskStack不存在,则新创建一个。
  FLAG_ACTIVITY_CLEAR_TOP :  清空要跳转Activity上面所有的Activity实例。
  FLAG_ACTIVITY_SINGLE_TOP:和singleTop启动模式类似。

问题描述

  在项目中,遇到了需要像微信一样管理Activity,即实现效果如下:

  假设App中有Main Activity(Root),Chat Activity,以及 Other Activity 三个Activity,其中Main Activity 在位于栈底,且为启动Activity

    1. App内,无论从哪里进入ChatActivity,Back回去都进入Main Activity

    2. 从HOME进入App,都为最后进入的Activity

    3. 从通知栏进入App,都默认进入Chat Activity

实现效果1:

  为了实现效果1,通常有两种方法,

  1. 修改Chat Activity 的Back方法,生成一个 Intent FLAG : SINGLE_TOP | CLEAR_TOP 标记的Intent,这样子,通过这个Intent启动MainActivity,会清空MainActivity上面所有的Activity。

  2. 启动Chat Activity的的Intent中,直接添加 Intent FLAG : SINGLE_TOP | CLEAR_TOP ,从Main Activity启动,这样子在启动Chat Activity的时候,直接清空Main Activity上面所有的Activity,然后从Main startActivity(Chat Activity);

实现效果2:

  实现这个的效果,最重要的是,不使用特殊的启动模式,singleTask,singleInstance(未测试),可以使用singleTop,standard模式

实现效果3:

  这个效果实现的方法,和实现效果1类似,不过需要添加NEW_TASK 这种Intent Flag。然而,如果我们把三种效果混合在一起,可能就遇到如下的问题。

混合问题

  从通知进入ChatActivity,然后点击HOME按钮,进入程序列表页面,然后再点击App的ICON,进入App,这时候,我们发现效果2无法实现,而是新建了MainActivity,点击Back按钮,进入的页面是之前的ChatActivity,相当于AC栈为 MainActivity->ChatActivity->MainActivity.

  为什么会遇到这个问题? 进过搜索资料以及实验,得出如下的结论:

    1. 当Main Activity 的launchMode为singleTask, singleInstance(未测试) 的时候,通常不创建新的MainActivity

    2. 当Main Activity的launchMode为standard,或者为signleTop的时候,则按照 栈顶的Activity(也就是Main Activity)的action 和category 是否和androidManifest.xml中的

        <action android:name="android.intent.action.MAIN"/>        

<category android:name="android.intent.category.LAUNCHER"/>

    一致,如果非一致,则创建新的Main Activity,否则就是简单的AC栈移动到前台。为了解决这个问题,我们只需要在启动MainActivity的时候,添加

      intent.setAction(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);当然为了能直接使用Context.startActivity 使用Intent,可以统一添加
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

转载于:https://my.oschina.net/darkgem/blog/591435

Android 启动模式简介相关推荐

  1. android任务栈的作用,Android 启动模式以及任务栈

    1.Android 主要包含4种启动模式,下面分别介绍四种启动方式的特点: 1)tandard 默认的启动模式,标准模式 每开启一个Activity,就会在栈顶添加一个Activity实例.多次间隔或 ...

  2. Android启动模式SingleInstance

    1.简介 Android四大启动模式分别为Standard,SingleTop,SingleTask,SingleInstance,其中前面三种平时使用的比较多此处不多做解析,重点分析下SingleI ...

  3. Android启动模式详解

    "在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...

  4. android 启动模式_安卓学习笔记之Android中Activity的4种启动模式

    根据Activity在任务栈中的调用方式不同,Activity的启动模式分为4种,分别是Standard.SingleTop.SingleTask以及SingleInstance.可以在Android ...

  5. android singleinstance home,Android启动模式之singleinstance的坑

    前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...

  6. Android启动模式介绍

    安卓Android一般有Meta.Normal.Bootloader.Recovery.Factory等启动模式,这些模式都需要在系统启动时通过按键等方式触发进入,除了Normal模式,其它模式都属于 ...

  7. android启动模式

    Activity加载模式 standard: 标准模式,一调用startActivity()方法就会产生一个新的实例. 对于每一个启动Intent都会生成一个activity的新实例. 跳转源和目的a ...

  8. Android ART模式简介

    新书上市<深入解析Android 5.0系统> 以下内容节选自本书 Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机.ART是AndroidRuntime的缩写,它 ...

  9. android l art模式,Android ART模式简介

    Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机.ART是Android Runtime的缩写,它提供了以AOT(Ahead-Of-Time)的方式运行Android应用程序的 ...

最新文章

  1. 马克.扎克伯格的执行力
  2. 如何用python生成表格_用 Python 生成 HTML 表格
  3. 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
  4. 回馈读者:赠花书一本!
  5. 在HTML文档内引入CSS
  6. amazeui学习笔记--css(布局相关3)--辅助类Utility
  7. 精度,精确率,召回率_了解并记住精度和召回率
  8. 前端学习(2048)vue之电商管理系统电商系统之实现首页内容自定制
  9. Pandas数据可视化工具:图表工具-Seaborn
  10. MAVLink 协议解析之XML定义篇
  11. CSS中文乱码解决方法
  12. getresourceasstream 路径_Java 获取资源文件路径
  13. 第一篇:centos7下svn的安装与卸载
  14. C++_Operator Overloading(运算符重载 | 计算有理数的加减乘除)
  15. 【三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1270期】
  16. rgba和hex之间转换
  17. C语言程序设计基础篇
  18. 信息安全专业面试知识点整理(密码学与信数基础)
  19. 转自于四火的唠叨(工程师的生活)
  20. Js篇-面试题9-请说一下Js中的事件循环机制

热门文章

  1. 从字符串中提取BCD码,转换为UINT数据并返回
  2. Visual Studio 2010 and .NET 4 RTM中文版发布
  3. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解...
  4. Uber将动态调价机制引入其外卖服务UberEats
  5. nagios配置监控的一些思路和工作流程
  6. 黑白青春-纪念那年我的秋天
  7. Javascript - 栈 和 单链表
  8. 这样你的电脑还不玩完!?
  9. 日志服务器搭建之多服务器日志转发与格式化处理
  10. React多页面应用脚手架-v1.3.0