四大组件之一 -- Activity

此章节参考Android官网内容而编写,如有遗漏,后面会慢慢补上。

一、Activity是什么?

Activity是android的一个应用组件,是用户与应用交互的活动窗口。一个应用由若干个Activity组成,每个Activity之间有或多或少的联系。

一般指定某个Activity作为应用的主Activity,应用启动的时候会先显示主Activity。而每个Activity都可以启动其他的Activity。

二、创建Activity

创建Activity,必须创建Activity的子类(或使用其现有的子类),需要在Acitivty的各个生命周期中调用回调方法。其中,最重要的两个回调方法是:

onCreate():必须实现此方法。系统会在创建您的 Activity 时调用此方法。您应该在实现内初始化 Activity 的必需组件。 最重要的是,您必须在此方法内调用setContentView,以定义 Activity 用户界面的布局。

onPause():系统将此方法作为用户离开 Activity 的第一个信号(但并不总是意味着 Activity 会被销毁)进行调用。 您通常应该在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回此界面)。

为了保证用户体验的流畅度,还需要在其他的生命周期回调函数中,写上处理逻辑。

在清单文件中声明 Activity:

在清单文件中,将<activity>添加到<application>的子项中。
下面列举<activity>节点的属性,并对部分做详细说明:

1.android:allowTaskReparenting                                                              2.android:alwaysRetainTaskState                                                        3.android:clearTaskOnLaunch                                                                        4.android:configChanges
在某些设备配置(比如屏幕方向,字体大小,网络类型等)发生变化的时候,Activity将会被重新启动以适配新的配置,这是系统行为。而Android同样为应用程序提供了一个阻止这种行为发生的手段,如果你不想因为某种配置变化而发生Activity重启,则可以通过配置这个属性并选择你想要阻止的配置。如果你配置完毕并选择了你关注的配置,则当这些配置发生改变的时候Activity不会重启,而是通过onConfigurationChanged()回调方法通知应用程序这些配置发生了变化。
5.android:enabled
6.android:excludeFromRecents
7.android:exported
8.android:finishOnTaskLaunch
9.android:hardwareAccelerated
该属性是指是否应为该Activity启动硬件加速,如果应启动,则为true,否则为false。默认值是false。
注意:不是所有的OpenGL 2D操作都会被加速。如果启用硬件加速渲染器,则要测试你的应用程序以便确保它能使用渲染器而不会产生错误。
10.android:icon
11.android:label
12.android:launchMode
这个属性描述了该Activity应该如何被启动。在Intent对象中,与Activity标志一起工作的模式有4种,分别是:standard,singleTop,singleTask和singleInstance。默认模式是standard。
13.android:multiprocess
14.android:name
15.android:noHistory
16.android:permission
17.android:process
18.android:screenOrientation
该属性表示Activity显示的方向(比如纵向,横向)。
19.android:stateNotNeeded
20.android:taskAffinity
21.android:theme
22.android:windowSoftInputMode
该属性表示Activity的主窗口如何与包含屏幕软键盘的窗口交互。设置该属性将影响两件事。
①软键盘的状态。当Activity获取输入焦点时,是否隐藏软键盘。
②对Activity主窗口的调整。该窗口是否被调整得更小一些来为软键盘腾出空间,或者它的内容是否被移动以便在部分窗口被软键盘覆盖时,使得当前焦点可见。

使用 Intent 过滤器:

<activity>元素还可指定各种 Intent 过滤器—使用<intent-filter>元素—以声明其他应用组件激活它的方法。

三、启动Activity

startActivity()
您可以通过调用startActivity(),并将其传递给描述您想启动的 Activity 的Intent来启动另一个 Activity.。
这里不仅可以启动应用内的Activity,还能启动其他应用的Activity。
还可以调用系统的某些功能,比如打电话,发邮件等。
startActivityForResult():
您可能需要从启动的 Activity 获得结果。在这种情况下,请通过调用startActivityForResult()(而非startActivity())来启动 Activity。 要想在随后收到后续 Activity 的结果,请实现onActivityResult()回调方法。 当后续 Activity 完成时,它会使用Intent向您的onActivityResult()方法返回结果。

四、结束Activity

您可以通过调用 Activity 的finish()方法来结束该 Activity。您还可以通过调用finishActivity()结束您之前启动的另一个 Activity。

五、管理Activity生命周期

Activity基本上是以三种状态存在:

运行中:此 Activity 位于屏幕前台并具有用户焦点。

暂停:另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态(Activity对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。

停止:该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity对象保留在内存中,它保留了所有状态和成员信息,但与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。

实现生命周期回调

onCreate(BundlesavedInstanceState):// The activity is being created.
onStart()// The activity is about to become visible.
onResume()// The activity has become visible (it is now "resumed").
onPause()// Another activity is taking focus (this activity is about to be "paused").
onStop()// The activity is no longer visible (it is now "stopped")
onDestroy()// The activity is about to be destroyed.

您在实现上面这些生命周期方法时必须始终先调用超类实现,然后再执行任何操作。

生命周期的三层嵌套:

整个生命周期:Activity 的整个生命周期发生在onCreate()调用与onDestroy()调用之间。您的 Activity 应在onCreate()中执行“全局”状态设置(例如定义布局),并释放onDestroy()中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate()中创建该线程,然后在onDestroy()中停止该线程。

可见生命周期:Activity 的可见生命周期发生在onStart()调用与onStop()调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在onStart()中注册一个BroadcastReceiver以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用onStart()onStop()

前台生命周期:Activity 的前台生命周期发生在onResume()调用与onPause()调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

下图是完整的activity生命周期图:


onCreate():首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态(请参阅后文的保存 Activity 状态)。始终后接onStart()。

onRestart():在 Activity 已停止并即将再次启动前调用。始终后接onStart()。

onStart():在 Activity 即将对用户可见之前调用。如果 Activity 转入前台,则后接onResume(),如果 Activity 转入隐藏状态,则后接onStop()。

onResume():在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接onPause()。

onPause():当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
如果 Activity 返回前台,则后接onResume(),如果 Activity 转入对用户不可见状态,则后接onStop()。

onStop():在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
如果 Activity 恢复与用户的交互,则后接onRestart(),如果 Activity 被销毁,则后接onDestroy()。

onDestroy():在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人对 Activity 调用了finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过isFinishing()方法区分这两种情形。

保存 Activity 状态

协调 Activity

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容