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的更多相关文章

  1. <Android基础>(二) Activity Part 1

    1.活动的基本用法: 1) 手动创建活动.创建加载布局 2) 在AndroidManifest文件中注册 3) 在活动中添加Button.Toast.Menu 4) 销毁活动 2.Intent 1) ...

  2. android 基础02 - Activity 的生命周期及状态

    返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...

  3. Android 基础 二 四大组件 Activity

    Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...

  4. Android基础之Activity launchMode详解

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Activity的lauchmode,是基础的属性,但也是App优化必须掌握的知识,它约束了Acti ...

  5. Android基础之Activity

    一.什么是Activity Activity是Android四大组件之一,并且Activity是组件中的重中之重. Activity是为用户提供一个用于信息交互的窗口. 二.如何去创建Activity ...

  6. Android基础之Activity四种启动模式

    这东西是最基础的,发现自己其实没有真正试过,好好研究研究 standard :默认, singleTop :大体上同standard,但是当该Activity实例已经在task栈顶,不再创建新的实例, ...

  7. Android基础_3 Activity相对布局

    相对布局要比前面讲的线性布局和表格布局要灵活一些,所以平常用得也是比较多的.相对布局控件的位置是与其周围控件的位置相关的,从名字可以看出来,这些位置都是相对的,确定出了其中一个控件的位置就可以确定另一 ...

  8. Android基础_2 Activity线性布局和表格布局

    在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是 ...

  9. 【Android基础】Activity之间进行参数传递的三种方式

    1.使用Intent进行传输 //发送数据的Activity class button implements OnClickListener{ @Override public void onClic ...

随机推荐

  1. scrapy之基础概念与用法

    scrapy之基础概念与用法 框架 所谓的框架就是一个项目的半成品.也可以说成是一个已经被集成了各种功能(高性能异步下载.队列.分布式.解析.持久化等)的具有很强通用性的项目模板. 安装 Linux: ...

  2. mysql uuid() 相同 重复

    mysql select UPPER(REPLACE(uuid(),'-','')) from xxxtable 得到相同的uuid的问题 - LWJdear的博客 - CSDN博客 https:// ...

  3. 关于微信小程序使用canvas生成图片,内容图片跨域的问题

    最近有个项目是保存为名片(图片),让用户发送给朋友或朋友圈,找了很多方案都不适用,绞尽脑汁之后还是选了使用canvas,但是用这玩意儿生成图片最大的缺点就是,如果你的内容中有图片,并且这个图片是通过外 ...

  4. laravel 关联中的预加载

    预加载 当作为属性访问 Eloquent 关联时,关联数据是「懒加载」的.意味着在你第一次访问该属性时,才会加载关联数据.不过,是当你查询父模型时,Eloquent 可以「预加载」关联数据.预加载避免 ...

  5. Json详解以及fastjson使用教程

    Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言.在使用Java做Web开发时,不可避免的会遇到Json的使 ...

  6. Oracle创建表空间、用户以及给用户赋权

    --创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m --创 ...

  7. Keras和tensorflow的区别

    参考: https://blog.csdn.net/zhangbaoanhadoop/article/details/82111056

  8. jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...

  9. Navicat Preminum

    此软件在连接的时候,需要这样: 新建链接==>连接属性==>编码选择自动==>如果此时点击确定的话,会把整个服务器的所有数据库都打开, 我们也可以只打开指定的数据库, 点击高级==& ...

  10. CMD & Git Shell & Bash Shell

    CMD & Git Shell & Bash Shell https://mvdan.cc/sh/cmd/shfmt PC