Android 启动模式简介
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 启动模式简介相关推荐
- android任务栈的作用,Android 启动模式以及任务栈
1.Android 主要包含4种启动模式,下面分别介绍四种启动方式的特点: 1)tandard 默认的启动模式,标准模式 每开启一个Activity,就会在栈顶添加一个Activity实例.多次间隔或 ...
- Android启动模式SingleInstance
1.简介 Android四大启动模式分别为Standard,SingleTop,SingleTask,SingleInstance,其中前面三种平时使用的比较多此处不多做解析,重点分析下SingleI ...
- Android启动模式详解
"在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...
- android 启动模式_安卓学习笔记之Android中Activity的4种启动模式
根据Activity在任务栈中的调用方式不同,Activity的启动模式分为4种,分别是Standard.SingleTop.SingleTask以及SingleInstance.可以在Android ...
- android singleinstance home,Android启动模式之singleinstance的坑
前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...
- Android启动模式介绍
安卓Android一般有Meta.Normal.Bootloader.Recovery.Factory等启动模式,这些模式都需要在系统启动时通过按键等方式触发进入,除了Normal模式,其它模式都属于 ...
- android启动模式
Activity加载模式 standard: 标准模式,一调用startActivity()方法就会产生一个新的实例. 对于每一个启动Intent都会生成一个activity的新实例. 跳转源和目的a ...
- Android ART模式简介
新书上市<深入解析Android 5.0系统> 以下内容节选自本书 Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机.ART是AndroidRuntime的缩写,它 ...
- android l art模式,Android ART模式简介
Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机.ART是Android Runtime的缩写,它提供了以AOT(Ahead-Of-Time)的方式运行Android应用程序的 ...
最新文章
- 马克.扎克伯格的执行力
- 如何用python生成表格_用 Python 生成 HTML 表格
- 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
- 回馈读者:赠花书一本!
- 在HTML文档内引入CSS
- amazeui学习笔记--css(布局相关3)--辅助类Utility
- 精度,精确率,召回率_了解并记住精度和召回率
- 前端学习(2048)vue之电商管理系统电商系统之实现首页内容自定制
- Pandas数据可视化工具:图表工具-Seaborn
- MAVLink 协议解析之XML定义篇
- CSS中文乱码解决方法
- getresourceasstream 路径_Java 获取资源文件路径
- 第一篇:centos7下svn的安装与卸载
- C++_Operator Overloading(运算符重载 | 计算有理数的加减乘除)
- 【三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1270期】
- rgba和hex之间转换
- C语言程序设计基础篇
- 信息安全专业面试知识点整理(密码学与信数基础)
- 转自于四火的唠叨(工程师的生活)
- Js篇-面试题9-请说一下Js中的事件循环机制
热门文章
- 从字符串中提取BCD码,转换为UINT数据并返回
- Visual Studio 2010 and .NET 4 RTM中文版发布
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解...
- Uber将动态调价机制引入其外卖服务UberEats
- nagios配置监控的一些思路和工作流程
- 黑白青春-纪念那年我的秋天
- Javascript - 栈 和 单链表
- 这样你的电脑还不玩完!?
- 日志服务器搭建之多服务器日志转发与格式化处理
- React多页面应用脚手架-v1.3.0