<Android基础>(二) Activity Part 2
1.活动生命周期
1)返回栈
2)活动状态
3)活动的生存期
2.活动的启动模式
1)standard
2)singleTop
3)singleTask
4)singleInstance
3.活动的优化设计
1)设计知道当前的运行活动
2)随时随地退出程序
3)程序的启动优化
2.4 活动的生命周期
2.4.1 返回栈
Android系统使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈为先进后出的数据结构。
启动一个新活动,它再返回栈中入栈,并处于栈顶的位置。每当按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总会显示处于栈顶的活动给用户。
(图片来源于网络)
2.4.2 活动状态
1.运行状态:当一个活动处于栈顶时,这时活动就处于运行状态。
2.暂停状态:当一个活动不再处于栈顶,但仍然可见(比如对话框形式的活动只会占有部分区域),这时就进入了暂停状态。
3.停止状态:当一个活动不在处于栈顶,并且完全不可见的时候,就进入了停止状态。系统仍会为这种活动保存相应的状态和成员变量,但并不可靠。
4.销毁状态:当一个活动从返回栈中移除后就变成了销毁状态。
2.4.3 活动的生存期
1.Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
onCreate( )。在活动第一次被创建的时候调用。在该方法中完成活动的初始化操作。如:加载布局、绑定事件等。
onStart( )。在活动由不可见变为可见的时候调用。
onResume( )。在活动准备好和用户进行交互的时候调用。此时活动一定位于返回栈的栈顶,并且处于运行状态。
onPause( )。在系统准备去启动或恢复另一个活动时调用。
onStop( )。在活动完全看不见的时候调用。它和onPause( )方法的主要区别在于,如果启动一个对话框式的活动,onPause( )就会执行,而onStop( )不会执行。
onDestroy( )。在活动被销毁之前调用,之后活动的状态将变为销毁状态。
onRestart( )。在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
2.三种生存周期
完整生存期。
活动在onCreate( )和onDestroy( )方法之间所经历的就是完整生存期。
可见生存期。
活动在onStart( )和onStop( )方法之间所经历的就是可见生存期。
前台生存期。
活动在onResume( )和onPause( )方法之间所经历的就是前台生存期。
Android官方提供的活动生存周期图。
(图片来源于网络)
2.4.5 避免活动回收数据消失
当一个活动进入了停止状态,是有可能被系统回收的。
Activity中提供了onSaveInstanceState( )方法,保证在活动被回收之前一定会被调用。
onSaveInstanceState( )方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据。如:putString( )方法保存字符串,putInt( )方法用于保存整型数字……
每个保存方法传入两个参数,第一个参数是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。
(创建新活动MainActivity, NormalActivity, DialogActivity)
1.MainActvity重写方法onSaveInstanceState( )
2.修改MainActivity的onCreate( )方法
2.5 活动的启动模式
standard、singleTop、singleTask和singleInstance
通过在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
2.5.1 standard
standard是活动的默认启动方式,在不进行显示指定的情况下,所有活动都会自动使用该启动模式。在standard启动模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。
每次启动都会创建该活动的一个新的实例。有时活动已经在栈顶了,再次启动时还要创建一个新的活动实例。
2.5.2 singleTop
当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已是该活动,则认为可以直接使用它,不用再创建新的活动实例。
Eg:
FirstActivity使用singleTop模式启动。
FirstActivity—>SecondActivity—>FirstActivity 仍会产生两个FirstActivity实例。
此时在FirstActivity按下Back键,返回SecondActivity,再按Back键返回第一个创建的FirstActivity,最后按下Back键才会退出。
2.5.3 singleTask
当活动模式指定为singleTask,每次启动该活动时系统首先会再返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有则创建新实例。
2.5.4 singleInstance
指定为singleInstance模式的活动会启用一个新的返回栈来管理活动。
假设程序中有一个活动是允许其他程序调用的,让其他程序和该程序可以共享这个活动的实例。在singleInstance模式下会有一个单独的返回栈来管理该活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈。
FirstActivity、SecondActitvity、ThirdActivity,其中SecondActivity使用singleInstance模式进行启动。
FirstActivity—>SecondActivity—>ThirdActivity
按下Back键进行返回,ThirdActivity直接返回了FirstActivity,再按下Back键返回SecondActivity,再按下Back键退出程序。FirstActivity和ThirdActivity在同一个返回栈,SecondActicity在单独的一个返回栈里。
2.6 活动的优化设计
2.6.1 设计知道当前是哪一个活动
新建一个Java类BaseActivity,让其继承AppCompatActivity类,在BaseActivity中重写onCreat( )方法。
在onCreat( )方法中获取了当前实例的类名,并通过Log打印了出来。
再次运行程序,就可以发现logcat中打印出了当前运行活动的名称。
2.6.2 随时随地退出程序
1.用一个专门的集合类对所有的活动进行管理。
设计一个类ActivityCollector,用List来暂存活动,提供addActivity()方法来向List中添加活动那个,removeActivity()方法来从List中移除活动,最后提供一个finishAll()方法来将List中的活动全部销毁掉。
2.修改BaseActivity中的代码
在onCreate()方法中调用了ActivityCollector的addActivity()方法,表明当前正在创建的活动增加到活动管理器里。在BaseActivity中重写onDestroy()方法,表明将一个马上销毁的活动从活动管理器中移除。
现在不论想在任何活动退出,只需要调用ActivityColletor.finishAll()方法即可。
Eg:
在ThirdActivity中的Button 3设置finishAll(),按下Button 3,即销毁所有活动。
加一句android.os.Process.killProcess(android.os.Process.myPid());可以杀掉当前进程的代码,以保证程序完全退出。
killProcess()方法只能用于杀掉当前程序的进程,不能用该方法去杀掉其他程序。
2.6.3 启动活动的最佳写法
假如SecondActivity中需要用到两个很重要的字符串参数,在启动SecondActivity的时候必须要传递过来。
1.常规写法:
2.优化写法
修改SecondActivity中的代码
在actionStart()方法中完成Intent的构建,所有需要的数据通过actionStart()方法的参数传递过来,然后存储在Intent中,最后调用startActivity()方法启动SecondActivity。
在FirstActivity中修改代码:
SecondActivity所需要的数据在方法参数中全部体现出来了,只需要一行代码即可启动SecondActivity。
<Android基础>(二) Activity Part 2的更多相关文章
- <Android基础>(二) Activity Part 1
1.活动的基本用法: 1) 手动创建活动.创建加载布局 2) 在AndroidManifest文件中注册 3) 在活动中添加Button.Toast.Menu 4) 销毁活动 2.Intent 1) ...
- android 基础02 - Activity 的生命周期及状态
返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...
- Android 基础 二 四大组件 Activity
Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...
- Android基础之Activity launchMode详解
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Activity的lauchmode,是基础的属性,但也是App优化必须掌握的知识,它约束了Acti ...
- Android基础之Activity
一.什么是Activity Activity是Android四大组件之一,并且Activity是组件中的重中之重. Activity是为用户提供一个用于信息交互的窗口. 二.如何去创建Activity ...
- Android基础之Activity四种启动模式
这东西是最基础的,发现自己其实没有真正试过,好好研究研究 standard :默认, singleTop :大体上同standard,但是当该Activity实例已经在task栈顶,不再创建新的实例, ...
- Android基础_3 Activity相对布局
相对布局要比前面讲的线性布局和表格布局要灵活一些,所以平常用得也是比较多的.相对布局控件的位置是与其周围控件的位置相关的,从名字可以看出来,这些位置都是相对的,确定出了其中一个控件的位置就可以确定另一 ...
- Android基础_2 Activity线性布局和表格布局
在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是 ...
- 【Android基础】Activity之间进行参数传递的三种方式
1.使用Intent进行传输 //发送数据的Activity class button implements OnClickListener{ @Override public void onClic ...
随机推荐
- VMware威睿
VMware总部位于美国加州帕洛阿尔托 [1] ,是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案, 企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任 [2- ...
- shell脚本--编写CGI代码(shell结合html)以及环境变量
实现shell和html标签混合的方式编写代码: 推荐 初始CGI ,看完大概之后,大概对cgi有个大体的印象.下面是编写混合代码的示例: #!/bin/bash #index.cgi echo & ...
- 文件传输协议FTP、SFTP和SCP
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
- python3 九九乘法表打印花式操作(然并卵)
# 九九乘法表# 方法一# for i in range(1, 10):# for j in range(1, i+1):# print('{}x{}={}\t'.format(i, j, i*j), ...
- Baby-Step-Giant-Step 很酷的算法
Baby-Step-Giant-Step BSGS算法用于解决形如: A ^ x ≡ B ( mod C ) 的问题. 学这个算法前需要具备以下知识:快速幂取模.扩展欧几里 ...
- oracle建表流程
--创建表空间test1 create tablespace test1 datafile 'd:\test1.dbf' size 100m autoextend on next 10m --创建用户 ...
- AngularJS 中的 factory、 service 和 provider区别,简单易懂
转自:http://blog.csdn.net/ywl570717586/article/details/51306176 初学 AngularJS 时, 肯定会对其提供 factory . serv ...
- 前端开发之css
<!--页面中的组成部分通常随便打开一个网页,有文字,图片,视频,表格,音频,表单(注册信息) css 属性/尺寸/边框/背景 1.css的尺寸属性,就是大小width max-width mi ...
- IntelliJ IDEA启动Tomcat后,却无法访问Tomcat主页 等一系列问题
1.IntelliJ IDEA启动Tomcat后,却无法访问Tomcat主页 转:http://www.myexception.cn/other/1998827.html https://blog.c ...
- linux中一些特殊的中文文件不能删除问题
例: [root@iZ2zecl4i8oy1rvs00dqzeZ tmp]# ,),(,,' [root@iZ2zecl4i8oy1rvs00dqzeZ tmp]# echo "rm -rf ...