Android--Task和BackStack高级
前言
之前的博客讲到了Android下Activity的启动模式,涉及到了Task和BackStack的内容,对这些不熟悉的朋友,可以先去看看:Android--Activity的启动模式。这篇博客主要讲讲Task和BackStack的高级内容。
本篇博客的内容包括:
开始一个Task
之前已经了解到,Android的Task通常起始于HOME页面下点击应用程序图标或其在桌面快捷图标。所以我们在开发一个应用程序的时候,需要指定应用程序的入口Activity,通过在AndroidManifest.xml清单文件中某个<Activity/>标签内,使用<intent-filter/>标签内指定。需要设置action为"android.intent.action.MAIN",设置category为"android.intent.category.LAUNCHER"。
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
这样,当用户点击应用程序图标之后,就会以这个入口Activity为基础,创建一个任务(Task),而这个Activity为这个Task中的第一个Activity,称为根Activity。
BackStack回退时Activity状态
Android中存在多个Task,但是同一时刻只有一个Task被置于前台,其它的均为后台,而后台的Task内的Activity,均为Stopped状态。Android系统中有多种方式切换Task,比如:按HOME键回到桌面、长按HOME键切换到其他Task等。而在同一个Task中,也只有BackStack最上面的Activity处于获得焦点的状态,其它也为Stopped,每当系统需要把Activity置于Stopped时,都会自动在Bundle中保其内控件的状态数据(需要为控件设置ID标识),比如:控件输入值、滚动条位置,以便下次获得焦点的时候自动还原。
但是有一种特殊的情况,对Android系统的内存管理有了解的朋友都应该知道,当系统资源不足的时候,如内存不足,会自动回收一些优先级比较低的组件的线程,以释放资源给新的组件使用。那么就存在问题了,当一个Task被切换到后台之后,如果系统资源告急,自动销毁了某个后台Task中的Activity(除了根Activity外),当用户再次切换回那个Task的时候,BackStack中存在这个Activity的标记,但是内存中已经不存在这个Activity的实例了,这个时候,系统就会通过Bundle来重新创建一个Activity用于还原它,这样保证了用户体验,使用户还是感觉在之前的页面中操作。但是这种情况下,Bundle是不会保存之前Activity中的信息的,比如:控件输入值、滚动条位置。这个时候,如果这个Activity的内容很重要的话,需要我们以编码的方式去保存数据,并在重新创建的时候,以编码的方式还原这个数据。
以上两种情况都需要用到两个Activity的生命周期方法,onSaveInstanceState()和onRestoreInstanceState()。但是第一种情况是系统帮我们维护的,第二种特殊情况,需要开发人员编码维护。下面是这两个方法的签名:
- protected void onSaveInstanceState(Bundle outState):当Activity被系统回收的时候被调用 ,用这个方法保存Activity中需要保存的数据,存入outState参数即可。
- protected void onRestoreInstanceState(Bundle savedInstanceState):当Activity被系统恢复的时候被调用,从Bundle中取出数据,设置会控件中,当然也可以通过重写onCreate()方法来设置数据,因为onCreate()一样可以获取到,但是推荐使用onRestoreInstanceState()。
BackStack的清理
上面描述的Activity被系统回收已经之后在还原的情况,为默认情况。在Android系统的清单文件中,不光为我们提供了设置启动模式的属性android:LauncherMode,还为我们提供了Activity的清理模式,有如下几个:
- android:alwaysRetainTaskState:这个属性只对根Activity有效,默认为false,当其设置为true的时候,当这个根Activity失去焦点被置于后台的时候,如不出现意外情况,其中的Activity将不会被系统回收。
- android:clearTaskOnTask:这个属性只对根Activity有效,当这个根Activity失去焦点被置于后台的时候,会清理BackStack中根Activity之上的所有Activity,并在下次获得焦点的时候显示根Activity。
- android:finishOnTaskLaunch:这个属性只应用于单个Activity,它默认为false,当其设置为true的时候,当前Task如果在这个Activity获得焦点的时候被切换到后台,那么这个Activity直接被销毁,哪怕只是离开一小会儿。
总结
自此就把Task和BackTask的内容介绍完了,把Task和BackStack理解透彻了,对android应用开发有非常好的作用。可以有效提高用户体验,应用中的Activity应该如何显示,应该长存(singleInstance),还是应该阅后即焚(finishOnTaskLaunch),等等场景。一款应用不应仅仅是功能的实现,还需要注重用户体验,它不仅仅是一款应用,而是应该把它当成一款产品来开发。
Android--Task和BackStack高级的更多相关文章
- Task和backStack(本篇章核心)
对Task和backStack的认识过程 1.由demo测试得到的关系图: 1.一个task中可以有多个app的Activity, 由于一个app可以对应一个或多个process, 2.所以一个ta ...
- Android开发之TextView高级应用
Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...
- Android开发之对话框高级应用
Android开发之对话框高级应用 创建并显示一个对话框非常easy.可是假设想进行一些更高级点的操作,就须要一些技巧了.以下将和大家分享一下对话框使用的一些高级技巧. 1.改变对话框的显示位置: 大 ...
- Android Task 与 Back Stack
Tasks and Back Stack 一个应用通常包括多个 activity.每个 activity应用设计为围绕针对执行用户特定的行为和可以启动其它 activity. 一个 Activity也 ...
- Android Task 相关
在日常开发过程中,只要涉及到activity,那么对task相关的东西总会或多或少的接触到,不过对task相关的一些配置的作用一直理解的还不是很透彻,官方文档在细节上说的也不够清楚,要透彻理解还是得自 ...
- ###Android 断点调试和高级调试###
转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...
- Android Task 任务
关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来,就难免会需要关心进程.线程这样的概念.在Android中,组件的动态运行,有一个最与众不同的概念,就是Task,翻译 ...
- [android]android Task 任务 简介
http://blog.csdn.net/guomeijuan916/article/details/8121468 关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来 ...
- Android学习之AppWidget高级效果
接着AppWidget基础学习,今天是一个"进阶版"的小例子,用来检验一下自己的学习效果.于是就做了一个掷骰子的Widget. 方便大家观看,先截图如下: 需要注意的是在drawa ...
随机推荐
- String.length()和String.getBytes().length
1.字符与字节 抛出如下代码: public static void main(String[] args) { String str = "活出自己范儿"; System.out ...
- CentOs查看某个字符串在某个目录下的行数
如果你想在当前目录下 查找"hello,world!"字符串,可以这样: grep -rn "hello,world!" ./ ./ : 表示路径为当前目录. ...
- 使用vue-awesome-swiper的相关问题
最近自己在仿做一个旅游网站的vue项目,在首页中使用了vue-awesome-swiper插件来实现轮播图的效果,发现了以下几种问题: 一.需要额外引入swiper.css 原来使用vue-aweso ...
- bs4库学习
# -*- coding:utf-8 -*- import bs4 import requests def tags_val(tag, key='', index=0): ''' tag指HTML元素 ...
- 机器学习——KMeans
导入类库 from sklearn.cluster import KMeans from sklearn.datasets import make_blobs import numpy as np i ...
- windows本地用户及组的区别
Administrators(超级管理员组) 用来管理注册用户或者具有一定权限的其他管理员,维护网站的运行. Administrators中的用户对计算机/域有不受限制的完全访问权,分配给该组的默认权 ...
- 我在B站投稿啦、、、
我在B站投稿啦....欢迎评论交流... https://www.bilibili.com/video/av31539882/ 怎样激活Win10系统修改windows系统账户的名称-mp4 外链: ...
- Linux 搭建Nginx+uWSGI+Django环境
安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...
- XML语言2.约束
三.XML的约束 目的:编写一个文件用来约束另一个xml文件的书写规范. DTD 用来约束xml的文件格式,保证这个文件是有效的. 内部DTD:所有的约束都是直接定义在xml文件中的 内部的 DOCT ...
- Python课程学习总结
Python的介绍 Python是一种高级动态.完全面向对象的语言,函数.模块.数字.字符串都是对象,并且完全支持继承.重载.派生.多继承,有益于增强源代码的复用性. Python是一种计算机程序设计 ...