Android基础知识-1
1、Android的Activity任务栈
在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名。任务栈是一中先进后出的结构,APP中每一个调用的Activity均会按照先后顺序进栈,处于焦点下的Activity处于任务栈的栈顶。
当用户按back键时,栈内的Activities会按照先后顺序出栈,并调用该Activity的OnDestroy方法。如果栈内已经没有元素时,系统会回收该APP的任务栈。
在Activity的的xml标签中,可以定义每个Activity的模式。不同的模式在任务栈中调用时的表现也是不同的:
- standard模式:标准模式。在该模式下,每次启动的Activity都会创建一个实例将其压入任务栈中,不管此时该Activity是否已经存在。
- singleTop模式:栈顶复用模式。如果当前启动的Activity此时恰好处于任务栈栈顶的位置,那么就会复用该Activity。此时不会重新执行Activity的OnCreate、OnStart和OnResume方法,但是会执行OnNewIntent()方法。如果该Activity不在栈顶位置,则与standard模式一样。
- singleTask模式:栈内复用模式。比较霸道的一种模式,当Activity启动时会判断当前栈内是否已经存在。如果不存在,先创建该Activity实例并将其压入任务栈内。如果存在,则会将该Activity上面的所有Activity清除掉,将该Activity调到栈顶位置,调用OnNewIntent方法。
- singleInstance模式:加强版的singleTask模式,这个模式下的Activity处于一个单独的任务栈内,除非所在的任务栈被销毁,否则不会创建新的Activity。
Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面.可以认为一个ActivityRecord就是一个Activity任务栈。
2、Activity的缓存
为什么要有Activity的缓存?举个栗子:当应用从Activity A进入到Activity B后的一段时间后,A的资源被系统回收。当你从B按back键要回到A时,前一次A的数据和状态都已经丢失,此时不会执行A的OnRestart方法,而是重新执行了A
的OnCreate方法。 So,Activity的缓存就有了存在的价值。
Activity有一个封装好的方法:onSaveInstanceState() 。当Activity被销毁之前,该方法会被回调用以保存Activity的状态和数据。该方法有个Bundle参数,方法中可以使用putString() 、putInt()方法保存需要保存的参数。在Activity启动调用
OnCreate方法时,也有一个Bundle参数,该参数就是上次Activity销毁时保存下来的数据。
那么有哪些场景会触发onSaveInstanceState()方法呢?答案是非用户主动销毁的动作那么该方法就都会被调用。
- 用户按HOME键的动作
- 切换到其他应用
- 灭屏时
- 从当前的Activity进入另一个Activity
- 如果不设定configchange属性,屏幕横竖屏切换也会,因为横竖屏切换时系统会先销毁当前Activity,然后在切换后再重新创建。
还有一些细节知识:
- UI布局中的每一个View都默认实现了onSaveInstanceState()方法,这意味着UI界面的每一个改动都会被存储并在Activity重建时恢复。这有一个前提,那就是这个UI界面需要一个ID,如果没有ID,前面的实现都不会被调用。
- onSaveInstanceState()方法调用有不确定性,只能用这个方法去记录activity的瞬间状态(UI的状态)。不能用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)。
- onSaveInstanceState()如果被调用,那么一定是在onStop()前被触发,但每次不一定是在onPause()之前或者之后触发。
明天继续~
Android基础知识-1的更多相关文章
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- Android基础知识巩固:关于PendingIntent和广播
平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...
- Android基础知识(一)
前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...
- 看看android基础知识,谁帮我作答
无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...
- Android基础知识学习
IPC (Inter-Process Communication) 意思是: 进程间的通信,是指两个进程之间进行数据交换的过程. Android中如何开启多进程呢? 只需要给四大组件(Activit ...
- Android基础知识之Manifest文件的组织结构
原文:http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签,她必须包含一个标签和指定的xmlns:android. p ...
- Android基础知识之拼写检查框架
原文:http://android.eoe.cn/topic/android_sdk 拼写检查器框架 Android平台提供了一个拼写检查器的框架,来方便你在你的应用中实现并使用拼写检查.这个框架是A ...
- android基础知识:SharedPreferences和PreferenceActivity
1.android文件存储 对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvi ...
随机推荐
- [探索]点点轻博客搬家到WordPress(一)
摘要:点点博客备份XML通过DiandianToWordpress-beta.sh(文末给出)搬家到Wordpress博客 本人曾使用过点点轻博客,也深知像点点博客,Lofter博客导出的XML文件不 ...
- Linux Kernel的Makefile与Kconfig文件的语法
https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...
- 求最短路径算法之SPAF算法。
关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...
- 【MS SQL】查看任务执行进度
原文:[MS SQL]查看任务执行进度 备份或还原数据库时,我一般是用MS SQL工具向导来进行,由于工具向导没有显示任务执行过程的状态, 如果数据库比较大执行时间较长的话,对任务啥时候执行完成比较迷 ...
- Repository 仓储
Repository 仓储 写在前面 首先,本篇博文主要包含两个主题: 领域服务中使用仓储 SELECT 某某某(有点晕?请看下面.) 上一篇:Repository 仓储,你的归宿究竟在哪?(二)-这 ...
- SQLSever: 如何在select中的每一行产生不同的随机数?
原文:SQLSever: 如何在select中的每一行产生不同的随机数? select 的随机函数有点假, 也许是因为它是基于时间来的吧, 同一select中由于时间无法错开导致产生的随机数都是一样的 ...
- mediawiki在windows下的安装
mediawiki在windows下的安装 对于刚接触wiki的朋友们来说,配置一个服务器环境,安装并运行mediawiki是一件很麻烦的事情,在这里,我尽量用通俗易懂的语言,介绍mw(mediawi ...
- 打开VMware的系统出错
打开VMware系统时,出现错误 “Invalid configuration file. File "I:/My Virtual Machines/Windows XP english P ...
- Metro UI 界面完全解析 (转载)
Metro在微软的内部开发名称为“ typography-based design language”(基于排版的设计语言).它最早出现在微软电子百科全书95,此后微软又有许多知名产品使用了Metro ...
- Love myself...
Sometimes we feel as if our lives rely on that one person. We think 'If I do this, he/she will like ...