Activity 比较详细的详解

本人第一次写东西,欢迎评论!!

Activity是四大组件之一

四大组件都是有个性的,所以他们都要在AndroidMainfest.xml文件中注册。
Activity 几乎算是所有开始接触Android的新手第一个接触到的基本组件,只要是一个完成的APP,Activity就是不可或缺的,看看google官网的解释:

Activities are one of the fundamental building blocks of apps on the Android platform. They serve as the entry point for a user's interaction with an app, and are also central to how a user navigates within an app (as with the Back button) or between apps (as with the Recents button).

看不懂?那就来看看翻译吧:

活动是Android平台上应用程序的基本构件之一。它们作为用户与应用程序交互的切入点,也是用户在应用程序中导航(如“后退”按钮)或应用程序之间的关键(与“更新”按钮一样)。

这样就清楚多了吧。

Activity 的新建

新建一个Activity其实很简单,如果用的是Android studio ,那就更简单了,因为As(Android studio的简称,以下用到的都会用简称)提供了一个可以快速新建Activity的选项:


图1 . 新建Activity

新建好了之后本来还需要到AndroidManifest.xml文件中配置信息的

图2 . APP第一个运行的Activity

但是As在新建的时候会智能的帮我们去配置,但是只是单纯的配置一个Activity而已,一个最简单的Activity配置是这样的

图3 . 最简单的Activity配置

如果要使用隐式意图Intent来开启这个Activity还需要配置里面的意图过滤器,也就是这个<intent-filter>标签,关于意图Intent这里就不说了,看我的有关意图的文章。
回到正题,如果用As开发,创建Activity也就选几个选项的事情,是不是很简单啊。

Activity的生命周期

Activity的生命周期从开始到销毁在Activity中经历的回调方法是这些

图4 . Activity的生命周期图

按照这个图,说说各个回调方法:

onCreate()

创建状态:在系统首次创建Activity时就会调用该方法,在这个方法中可以设置application的一些基本启动程序,包括获取控件,填充数据等等,由于是创建方法,所以在整个生命周期中,该方法只会被调用一次。注意:不可在onCreate()方法中去获取控件的尺寸,因为这是做不到的,来看一看各个回调方法调用的顺序:

图5 . 生命周期顺序

onStart()

开始状态:通过这个方法,Activity将会进入前台,使活动对用户可见,该方法在onCreate()后面调用,该方法还会在另外一个方法后面调用,就是onRestart()方法,该方法后面再说。

onResume()

交互状态,也称恢复状态:调用这个方法时,说明Activity已经被置于前台了,进入了与用户交互的状态。就是说,用户可以操作该Activity了。

onPause()

暂停状态:Activity进入暂停状态,但依然可见,比如被半透明的弹框遮住,也就是该Activity中断了,可以使用该
方法释放系统资源,例如广播接收器,传感器(例如GPS)的手柄,或任何可能影响电池寿命的资源,因为活动暂停,已经不需要这些资源了。

onStop()

停止状态:当您的活动对用户不再可见时,它已进入 停止状态,系统调用onStop()回调。例如,当新启动的活动覆盖整个屏幕时,可能会发生这种情况。当活动完成运行时,系统也可以调用,并且即将被终止。在该方法中,应用程序应该释放几乎所有的用户不需要的资源。例如,如果您注册一个BroadcastReceiver在侦听可能会影响用户界面的变化,你可以注销在广播接收器 ,因为用户不再能看到的UI。同样重要的是,您可以使用 释放可能泄漏内存的资源,因为系统可能会在不调用活动最终onDestroy回调的情况下终止托管活动的进程 。您还应该使用相对CPU密集的关机操作。例如,如果您无法找到更适合将信息保存到数据库的时间,则可能会在此期间执行此操作。以下示例显示了一个实现 ,将注释草稿的内容保存到永久存储。在这个方法之后呢,会有两条路,一条是销毁onDestroy(),一条是重生onRestart()

onRestart()

切换到别的界面之后重新进入Activity,而后调用的方法是onStart()方法,重新回到前台。

onDestroy()

销毁,该方法是整个生命周期的最后一个方法,也只调用一次,调用这个方法证明这个Activity已经到尽头了,所以就完了。

害怕自己文笔不是很好,所以附上google官网的图,这样就更清楚啦。

图6 . Activity回调方法以及说明

关于 ‘是否能事后终止’ 一栏:是,则表示随时有可能被系统终止,就算是在onPause()方法,返回到onResume()方法期间也有可能被系统终止。

杂.记

切换横竖屏还重启Activity?

众所周知,手机屏幕是可以切换横竖屏的,在切换横竖屏或者做某些操作的时候,会让整个Activity销毁后重新创建。其实这也没什么,只是在你没有保存你的Activity状态时,切换横竖屏就会丢掉一些数据,这是一件比较不爽的事。那有没有办法阻止Activity在切换横竖屏的时候不销毁呢,可以这样子做:

图7

在Activity中有个属性android:configChanges,该属性是确定友哪些操作引起的本来需要重启的操作,现在不用了,参数就是这些操作,比如orientation就是屏幕方向也就是切换横竖屏,而keyboardHidden则是表示键盘可用性及语言,如上图所示,参数可以有多个,只需要用通道|连接即可。当然啦,你也可以老老实实的去保存Activity的状态,

注意:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本(正如minSdkVersiontargetSdkVersion属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了"orientation"值以外,您还必须添加"screenSize"值。 也就是说,您必须声明android:configChanges="orientation|screenSize"。但是,如果您的应用面向 API 级别 12 或更低版本,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。

接下来说说Activity的启动模式

Activity的四种启动模式

再说启动模式之前,先说说Activity被创建之后所在的地方,被称为返回栈,这个栈只有栈顶一个口,进和出都在这里,创建一个Activity就放入这个栈中,如果在栈中已经有Activity,那么新创建的Activity会置于栈顶,将其他的Activity压于栈底,而手机显示的就是处于栈顶的Activity。
引用一下官网的:

当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行

还有更为直观的图:


图8 . Activity进/出栈过程

说会启动模式。
四种启动模式分别是:standardsingleTopsingleTasksingleInstance。在说其中模式的区别之前,先说说设置方法,其实也就是在AndroidMainfest.xml文件中Activity配置标签中的一个属性:launchMode像这样:

启动模式的配置

启动模式的区别

standard(标准)是最普通的模式,也是默认的模式。就是说,在没有指定某一种启动模式时,系统会默认使用这一种模式,这模式特点就是可以有多个实例,如果Activity1是使用了该模式,可以不断创建该Activity,就算在返回栈中已经存在该Activity,所以,如果打开了三次这个Activity(就是创建三次Activity,并将之置于返回栈),那么需要“返回”三次才能推出这个Activity。

singleTop(栈顶唯一),由名字可以知道,如果再次创建正处于栈顶的Activity,那么将不会创建,而是继续复用这个Activity。

singleTask(栈唯一),由名字可以知道,在这种模式下,如果需要创建的Activity在栈中已经存在,那么将不会创建,而是将这个Activity提升到栈顶,继续复用这个Activity。

singleInstance(实例唯一),如果选择了这种模式,那么无论在这个Activity的返回栈中是否存在这个Activity,系统都会为这个Activity重新创建一个单独的返回栈,这样,整个系统就只有这个Activity的这一个实例,所有的APP都可以访问这个Activity。就像打电话的Activity。

Activity的开启与销毁

Activity有两种开启方式:
一种是startActivity(),另一种是startActivityForResult()。区别也很简单,一种是没有返回值的,一种是有返回值的,但是都可以将数据传输到被打开的Activity,其中用到的就是意图Intent,由于这篇文章是我专门写Activity所以就不说Intent了。然而启动Activity,Intent是必不可少的,所以在我的有关Intent的文章中会再次说到开启活动。

那第二种启动方式返回的值该怎样获取呢?

在Activity中有这么一个函数onActivityResult(),所有由第二种方式开启的Activity返回的值都是返回到这里的。

那该怎样区分哪个值是由哪个Activity返回而来的呢?

那当然是要靠请求码和返回码啦。在调用第二种开启方式是需要参数,完整的方法,包括参数是这样的startActivityForResult(Intent intent,int requestCode),第二个参数requestCode是一个请求码,然而在被开启的Activity也有一个返回方法setResult(int resultCode,Intent intent),第一个参数resultCode是一个返回码,这两个码都可以用来解答上面的问题。当然啦,在调用setResult()方法之后就要销毁被打开的页面了,毕竟调用了这个方法,就代表你已经要返回数据并退出这个Activity了。
那如何销毁一个Activity呢?最简单直接的就是finish()方法。当然除了这个方法之外,肯定还有其他的方法。就比如ActivityCollector.finishAll(),销毁所有活动等等。

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

推荐阅读更多精彩内容

  • Activity 一、四种形态 运行状态: 当 Activity 处于栈的顶层,可见,并可与用户进行交互 onRe...
    任教主来也阅读 1,661评论 1 10
  • [文章内容来自Developers]应用通常包含多个 Activity。每个 Activity 均应围绕用户可以执...
    岳小川阅读 691评论 0 4
  • 任务和返回栈 应用通常包含多个Activity。每个 Activity 均应围绕用户可以执行的特定操作设计,并且能...
    xinlingzhiyi阅读 678评论 0 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,213评论 25 707
  • /风悦安 夜色的温柔容纳你的孤单,一点一丢的心事掺杂着风景片段。黑白色的格调在氤氲成雨,包裹着你的难过,你说你丢了...
    风悦安阅读 245评论 0 2