什么是Activity?
Android四大组件有Activity,Service服务,Content Provider内容提供,BroadcastReceiver广播接收器
而Activity是作为Android组件中最基本也是最为常见用的四大组件之一
Activity概要
● 一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口;窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上
● 一个应用程序通常由多个activities组成;通常,一个应用程序中的都有一个mainactivity,相当于程序的入口。其他Activity从这个Activity启动;每一次一个Activity启动,前一个Activity就停止了,但是系统保留Activity在一个栈上(“back stack”)
● 当一个新Activity启动,它被推送到栈顶,取得用户焦点;Back Stack符合简单“后进先出”原则,所以,当用户完成当前Activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的Activity恢复
● 当一个Activity因新的Activity启动而停止,它被通知这种状态转变通过Activity的生命周期回调函数;有许多回调函数一个Activity可能会收到,源于它自己的状态变化-无论系统创建它、停止它、恢复它、摧毁它-并且每个回调提供你完成适合这个状态的指定工作的机会
● 例如,当停止的时候,你的Activity应该释放任何大的对象,例如网络数据库连接。当Activity恢复,你可以重新获得必要的资源和恢复被中断的动作。这些状态转换都是Activity的生命周期的部分
Activity栈
● 在Avtivity状态切换时,这时就需要考虑Activity栈
● 每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的
● 当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部
● 如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态
● 一个应用程序的优先级是受最高优先级的Activity影响的;当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级
Activity详细说明
在Android 中,Activity 拥有四种基本状态:
● Running(运行):在屏幕前台(位于当前任务堆栈的顶部)
● Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity可能是透明或未完全遮挡)
● Stopped(停止):完全被另一个Activity覆盖
● Destroyed(销毁):退出,完全销毁
活动状态(running)
活动状态一般是指该Activity正处于屏幕最显著的位置上显示,即该Activity是在Android活动栈的最顶端
● 一般地当Activity 创建后就是处于该状态中
● 期间触发的函数及顺序为: onCreate() ->onStart() -> onResume()
其中:
● onCreate()只有在该Activity是第一次被创建时才会被调用,主要是负责Activity的一般性的初始化设置,包括视图的创建,数据的绑定等等;需要注意的是若之前有冻结的state(即系统对该Activity调用过onSaveInstanceState()函数),则可以通过其 Bundle 参数进行state恢复
● onStart()是当Activity正在变为可见状态时才会被调用;一般地在此期间可以注册一个广播等等
● onResume()是在该Activity将要和用户进行交互时被调用,此时Activity位于的活动栈顶部
暂停状态(paused)
暂停状态一般指该Activity已失去了焦点但仍然是可见的状态(包括部分可见)。一个处于暂停状态的Activity只有在系统极度缺乏内存资源的情况下才会被系统强制结束
● 运行状态到暂停状态所触发的函数及顺序为:onResume() -> onPuased()
● 暂停状态恢复至运行状态所触发的函数及顺序为:onPuased() -> onResume()
其中:
● onPuased()是当一个Activity失去系统焦点后将会被调用,包括见面被部分遮挡,以及设备转入休眠状态等等
● 一般地在此期间对一些未保存的数据进行持久化并停止其他需要耗费CPU的操作,同时不可进行耗时操作,否则会阻塞系统UI线程
停止状态(stopped)
停止状态一般指该Activity被另一个Activity完全覆盖的状态,这是它仍然保持所有的状态,但是由于该Activity变得不可见,所以系统经常会由于内存不足而将该Activity强行结束
● 暂停状态到停止状态所触发的函数及顺序为:onPuased() -> onStop()
● 停止状态恢复至运行状态所触发的函数及顺序为:onStop() -> onRestart() -> onStart() -> onResume()
其中:
● onStop()是当一个Activity变为不可见时将会被调用,此时可能是由于该Activity要被注销或新的Activity完全遮挡了该Activity
● 在此期间一般可以进行取消注册广播等操作,因为用户不可见; onRestart()是当一个Activity从停止状态恢复至运行状态时将会被优先调用
死亡状态(Destroyed)
死亡态是指该Activity被系统销毁;当一个Activity处于暂停状态或停止状态时就随处可能进入死亡状态,因为系统可能因内存不足而强行结束该Activity
停止状态到死亡状态分为两种情况:
● (1)由用户操作导致,则执行:onStop() -> onDestroy()
● (2)由系统自动强制执行,则该Activity被强行结束
其中:
● onDestroy()是当一个Activity正在被系统finished期间被调用的
Activity的监控范围内的三个主要循环
● Activity的“整个生命周期”是发生在第一次调用onCreate(Bundle)和唯一最后调用onDestroy()方法之间;一个Activity会在onCreate()方法中设置全局状态,并在onDestrory()方法中释放余下的资源。例如:Activity有一个运行在后台的线程用来从网络上下载数据,则这个线程可能在onCreate()方法中被创建,并在onDestroy()方法停止线程
● Activity的“显示生命周期”是发生在调用onStart()方法以及调用相对应的onStop()方法之间
● 这段期间,用户可以在屏幕上看到Activity,尽管该Activity可能不在前面(可能隐藏被透明的Activity覆盖等)并与用户交互
● 在这两个方法中间你可以维护所需要的显示给用户的资源。例如:你可以在onStart()方法中注册一个BroadcastReceiver来检测影响你用户界面的改变,并当你的用户不在见到显示的东西时在onStop()方法中撤销该BroadcastReceiver。随着Activity对用户的可见和不可见状态的转变,onStart()方法和onStop()方法能被调用多次
● Activity的“前台生命周期”(foreground lifetime的意思就是当前Activity显示在屏幕上并且用户能与之交互的一个状态)发生在调用onResume方法以及相应的onPause方法之间
● 在这段期间,Activity处在其他Activity的前面并能与用户直接交互。Activity会经常在恢复和暂停的状态中转换;例如,当设备休眠时,当一个新的intent被传递到另一个Activity时。因此在这些方法中代码应该要相当轻量级
Activity七大生命周期函数
生命周期流程图:
这个流程图基本说明Activity生命周期的几个过程,我们就来说一说这几个过程
● 1、启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态
● 2、当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行
● 3、当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态
● 4、当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态
● 5、用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态
● 6、当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态
● 7、用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity
Acticity 的优势
● 切换方便,fragment俗称碎片化,可以使你能够将Activity分离成多个可重用的组件,每个都有它自己的生命周期和UI
● 非常灵活,可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸;从手机到平板电脑.
● 为什么不用Activity,也能达到同样的效果啊,mmp,这个答案是解决Activity间的切换不流畅,轻量切换
● 为什么不能用view,感觉效果是一样的, 答案:可以拥有自己的startActivityForResult回调.而view就没有了
● 不用去管view的复杂层级.可以随意组合
● 最重要的一点,因为application没有生命周期(也不算没有,只是没有销毁的回调),Activity是有生命周期,而fragment的生命周期是依附在Activity的,那么.方便统一管理,以及界面多层悬浮问题可以不用写多套.写在Activity就可以进行操作
尾述
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉
PS:有问题欢迎指正,可以在评论区留下你的建议和感受;
欢迎大家点赞评论,觉得内容可以的话,可以转发分享一下
网友评论