Andorid Activity的本质是什么

  次阅读 作者:智能小宝 来源:互联网 2016-01-14 10:26 我要评论(0)

本文我主要通过查看Activity的实现源码和推测其设计思想的方法来探讨一下Android的本质是什么。

Activity恐怖是Android用得最多且是最基本的组件了,估计也是每个学Android的人接触的第一概念,对于Activity的理解和说法,层出不穷,有人说是一个窗口,有个说是一个活动,但他的本质是什么呢,官方的说法是Activity一个应用程序的组件,它提供一个屏幕来与用户交互,以便做一些诸如打电话、发邮件和看地图之类的事情,原话如下:

An Activity is

an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.

这句话概括的很好,但我并不认为这就是Activity的本质。

切入主题之前,我们先要了解一下UI系统的职责和原理。所有的图形界面,无论是什么UI系统,都要收集用户的活动,这些活动包括打开和关闭程序,输入事件等,这样系统才能针对这些活动做出一些反应,比如程序打开时加载一个数据库,建立一个网络连接,不过针对这些活动所作出的反应都委托给了具体的应用程序,系统相当于只是把这些事件或消息转发给应用程序。这个消息怎么转发给程序呢,可以约定好,要求应程序写一个方法,或如果是C可要求传入一个回调,Java可以要求程序传入一个监听器,总之实现这个功能还是很容易的,但这么多消息,全部传到一个方法里吗,我想那样会很惨,那样可能要求你写应用程序的时候可能要写一个长长的swich语句或if语句,所以一般都把这些消息分类,如一种是整个程序的活动的消息,如关闭和打开,还有就是输入事件,如按键鼠标,每个分类里的消息还可以再细分,这样的话,就可以封装成多个类或接口,每个类有数个方法,之后应用程序重写这些类方法或实现某个接口,系统就可以通过调用这些类或接口的实例发送消息了。

于是问题转化成了类的设计。在Windows中,有个窗口类来接受一个窗口的活动,系统就可以通过调用窗口类的方法来传递消息,这个窗口类既接受打开和关闭的活动,又接受用户输入事件。而在Android中而不同,Activity只接受打开和关闭等的活动,而不会接受输入事件,那是由Activity内嵌的Window类来接受的,然后转发给相应View,你有可能会说Activity中有个onKeyDown方法,其实那只是处理没人领的按键消息才会到达Activity。现在发现Android和Windows分发消息的的区别了吧,这样化分,每个类的职责更细了,更明确了,当然喽,Android中的消息跟Windows中的可能有点稍小的区别。

现在应该可以很容易的理确Android的每一个生命周期对应的方法(onCreate, onStart...)其实是处理收到的消息,当用户打开一个Activity的时候,系统(严格的说应该是ActivityManager)就会调用onCreate来告诉你这个消息,这个时候你就要加载你的XML布局文件并做一些初始化。然后离开的时候,就应该把这个Activity销毁吗,如果用户是暂时离开,等下还要回来呢,如果销毁了那就又得重创建,太浪费时间了(用我们家乡话说就是太难费神了),所以不能销毁,但是系统也得通知你用户离开了(用的是onStop方法),因为可能需要暂停播放视频。当下次重新进入的时候,系统又会通知你用户又进来了,这时你可能要恢复播放了,但你有没有发现,用户第一次进入和再次进入,你需要做不同的处理,第一次可能是初始化一些资源,第二次可能只要恢复播放就可以了,所以系统应该告诉你,是第一次进入还是再次进入,于是系统就用了两个方法,用onCreate告诉你用户是第一次进入的,用onStart告诉你用户是再次进入。

不过这还不算完,还有一种情况,用户是半离开状态,什么是半离开呢,都知道Android的界在有全屏,还是非全屏,也有半透明的,这里的半离开指的就是本界面被一个非全屏或半透明的界面盖住,总之,你还能看到一点点被盖的那个界面;全离开就是被全屏的界面盖住,用户完全看不到被盖的。这两种情况要有可能要区别对待,比如一个播放在线视频的应用,它可能希望要在用户半离开时只暂停播放,不暂停后台下载,而当用户完全离开时,播放和下载都暂停。所以系统也应该区分这种情况,于是就有了onPause和onResume来表示半离开和从半离开恢复。值得注意的是,Android中全离开包括了半离开,半离开不包括全离开,什么意思呢,就是即便是全离开,系统也是先调onPause再调onStop,从全离开中恢复,也是调了onStart后还会调onResume,而对于第一次进入,onCreate、onStart、onResume会被依次调用,所以记住,只要用户进入,无论是怎么进入的,都是调用onResume,在这里恢复播放是再适合不过的了。还有一个onDestory也说一下,就是在销毁的时候被调用,一般是回收资源或按了返回键会被销毁。现在清楚了,也顺便看一下Android官网的这张图吧:

然后,你可能好奇系统是怎么调用到你写的onCreate方法的,有兴趣的可以查看源码的framewZ

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...