Activity详解

栏目: IOS · Android · 发布时间: 5年前

内容简介:在介绍Activity生命周期之前,我们先来了解一下Activity的四种基本状态:Active/Running:Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。Paused:当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。但我们需要明白,此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还存在,只有在系统内存紧张的情况下,才有可能被

在介绍Activity生命周期之前,我们先来了解一下Activity的四种基本状态:

Active/Running:Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。

Paused:当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。但我们需要明白,此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还存在,只有在系统内存紧张的情况下,才有可能被系统回收掉。

Stopped:当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量。

Killed:当Activity被系统回收掉时,Activity就处于Killed状态。 Activity会在以上四种形态中相互切换,至于如何切换,这因用户的操作不同而异。了解了Activity的4种形态后,我们就来聊聊Activity的生命周期。

Activity详解

onCreate

Activity被创建时的第一个方法,表示正在被创建,一些初始化工作在这里(加载布局资源,初始化所需要的数据等),如果有耗时任务需开异步线程去完成。

onStart

Activity正在被启动,在这个状态下Activity还在加载其他资源,正在向我们展示,用户还无法看到,不能交互

onResume

Activity创建完成,用户可看见界面,可交互

onPause

Activity正在暂停,正常情况下接着会执行onStop()。这时可以做数据的存储、动画停止的操作,但是不能太耗时,要不然影响新Activity的创建

onStop

Activity即将停止,这时可以做一些回收工作,一样不能太耗时

onDestory

Activity即将被销毁,可以做一些工作和资源的回收(Service、BroadCastReceiver、Map、Bitmap回收等)

onRestart

Activity正在重新启动,一般时当前Activity从不可见到可见状态时会执行这个方法,例如:用户按下Home键(锁屏)或者打开新Activity再返回这个Activity

思考问题:(实际操作打印生命周期执行顺序)

1.启动AActivity 2.AActivity创建完成,按Home键回到主屏 3.按Home键再主屏,再次点击App回到AActivity 4.AActivity去打开BActivity 5.在BActivity点击Back键回退 6.熄屏、亮屏 7.系统配置改变(横竖屏切换) 8.内存不足导致低优先级的Activity被杀死

启动模式

standard

Standard模式是Android的默认启动模式,你不在配置文件中做任何设置,那么这个Activity就是standard模式,这种模式下,Activity可以有多个实例,每次启动Activity,无论任务栈中是否已经有这个Activity的实例,系统都会创建一个新的Activity实例

singleTop

SingleTop模式和standard模式非常相似,主要区别就是当一个singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例,现在把配置文件中FirstActivity的启动模式改为SingleTop,我们的应用只有一个Activity,FirstActivity自然处于任务栈的栈顶。

SingleTask

SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。修改上面的程序,新建一个SecondActivity,将FirstActivity设置为singleTask启动模式,并让它启动SecondActivity,再让SecondActivity来启动FirstActivity。

singleInstance

singleInstance模式也是单例的,但和singleTask不同,singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而singleInstance Activity在整个系统里只有一个实例,启动一singleInstanceActivity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。

SingleInstance模式并不常用,如果我们把一个Activity设置为singleInstance模式,你会发现它启动时会慢一些,切换效果不好,影响用户体验。它往往用于多个应用之间,例如一个电视launcher里的Activity,通过遥控器某个键在任何情况可以启动,这个Activity就可以设置为singleInstance模式,当在某应用中按键启动这个Activity,处理完后按返回键,就会回到之前启动它的应用,不影响用户体验。

onNewIntent

避免Activity之间的跳转传值多次实体化

Activity详解

如果在 AndroidManifest.xml 中,将 Activity 的 launchMode 设置成了 "singleTop" 模式,或者在调用 startActivity(Intent) 时,设置了 FLAG_ACTIVITY_SINGLE_TOP 标识,那么,当该 Activity 再次被启动时,如果它依然存在于 Activity 栈中,并且刚好处于栈的最顶层时,那么它将不会被重新创建,而是直接使用原来的实例,此时,onNewIntent(Intent) 将会被调用,后续生命周期中的其它方法,就可以使用 onNewIntent(Intent) 传递过来的新的 Intent 参数了。(也就是说,其它方法可以使用更新后的 Intent 参数)

调用顺序如下: onNewIntent() -> onRestart() -> onStart() -> onResume()

需要特别注意的是, 如果在 onNewIntent(Intent) 中,不调用 setIntent(Intent) 方法对 Intent 进行更新的话,那么之后在调用 getIntent() 方法时得到的依然是最初的值。

IntentFilter

意图过滤器,Activity之间通过intent实现通信,intent-filter就是用来注册Activity,Service和Broadcast Receiver 使Android知道那个应用程序(或组件)能用来响应intent请求使其可以在一片数据上执行那个动作。为了注册一个应用程序组件为intent处理者,在其组件的manifest节点中添加一个intent-fillter标签。

1.动作测试(action)

一个intent对象只能指定一个action,而一条元素至少应该包含一个,否则任何Intent请求都不能和该匹配;

一个intent对象的action必须和intent-filter中的某一个actiong匹配,才能通过;

如果intent对象不指定action且intent-filter的action列表不为空,则通过;

2.类别测试(category)

简单的说就是种类匹配Intent-Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配,对于 IntentFilter中多余的声明并不会导致匹配失败。有一个重要的点就是如果intent 是implicit intent(隐式意图),android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败,换句话说就是必须加上这个category。

3:数据测试(data)

data有两部分构成,一个是数据类型,另一个是URI。每个URI包括四个属性参数(scheme,host, port, path),形如:scheme://host:port/path, 其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。 Intent filter和Intent相互配合,实现了Android系统四大组件之间的信使功能。

URL_Scheme就用到了data,将在后面阐述-

onConfigurationChanged

在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。 你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的 onConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明), 你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。

其次:android:configChanges=""中可以用的值:keyboard|mcc|mnc|locale|touchscreen|keyboardHidden|navigation|orientation…… Configuration 类中包含了很多种信息,例如系统字体大小,orientation,输入设备类型等等. 比如:android:configChanges="orientation|keyboard|keyboardHidden"

数据保存与恢复

系统配置改变时,会用到Activity中数据保存与恢复(onSaveInstanceState和onRestoreInstanceState)

URL_Scheme

scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

一个完整的Scheme的协议格式由 scheme、userInfo、host、port、path、query和fragment 组成。结构如下:

scheme://userInfo@host:port/path?query#fragment

startActivityForResult

Activity在finish的时候需要向上一个Activity传值的时候,我们就可以使用startActivityForResult。比如打开相册选取照片,拍照,关闭页面需要返回一个参数给打开我们的页面。

使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data),前面的Activity中通过onActivityResult(int requestCode, int resultCode, Intent data)方法接受回传值


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件开发本质论

软件开发本质论

Ron Jeffries / 王凌云 / 人民邮电出版社图灵分社 / 2017-1 / 39

想象你正在攀登一座名为“软件开发”的山峰。本书是与你同登一座山峰的敏捷先驱所带来的话语与图片。他在崎岖的山路边找到相当平坦的歇脚处,画下所见的风景,并写下自己的想法和发现。他瞧见很多条上山的路,愿以此书与你分享哪条路容易、哪条路困难、哪条路安全、哪条路危险。他还想指引你欣赏身后的美景。正是这些美景丰富了你的登山之旅,让你在重重困难中收获成长。 “对于每一位CTO、技术VP、软件产品总......一起来看看 《软件开发本质论》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具