本部分内容参考这里。
manifest
声明activities
需要在manifest文件中的<application> element中增加<activity> element。<activity>的属性中,仅有android:name是必须的,这个属性即为这个activity对应的java类。
publish过的app,activity的名称是不能改变的。参考这里。
<activity> 的属性参考这里。
声明intent filter
intent filter指明了activity可以执行的任务。<intent-filter> element的属性参考这里。<intent-filter>必须包含<action> element。
android预定义的action可以在Intent类的文档中查到,API27。
Lifecycle callbacks
注意,activity在android系统中,有get/lost focu和is/not visible两种状态类别.
onCreate()
必须实现这个函数。
所有仅需执行一次的初始化过程。
onStart()
activity变得可见时调用此函数。注册BroadcastReceiver。
onResume()
activity此时开始与用户交互,activity停留在该函数中直到失去用户交互。
由于activity将在Resume state和Pause state之间切换,android在每次切换到Resume state时,都将调用onResume()函数。在onResume()函数中可对某些资源进行重新获取或者初始化。这些资源应当在Pause state中得到释放。
onPause()
activity进入Pause state,释放资源。在onPause()中不要执行过于heavy或者耗时的操作,例如访问数据库或者网络,这些工作在onStop()中进行。
activity在进入Pause state后不是立即进入Stop state,而是取决于当时的情形。实际上进入Pause state后,activity可能仍可见,此时若重新变成焦点,那么android将调用onResume()来还原。当activity从可见变为不可见,那么onStop()将会被调用。
onStop()
当activity不可见时,将进入Stopped state。此时释放绝大多数资源,并且进行访问数据库等操作。但是android系统会通过onRestart()重新进入activity,此时无需对onResume()之前的数据进行重新初始化,因为android会在Stopped state时自动保存。
onDestroy()
在终止前的最后调用。可以使用isFinishing()来判断是主动退出还是系统终止。有时当设备冲竖直状态切换到水平状态时,android系统也会调用onDestroy()并立即调用onCreate()。
在Activity之间切换
使用startActivity()或者startActivityForResult()函数切换到一个新的activity上,无论采用哪种,都需要提供一个Intent对象。
若不需要有返回数据,则使用startActivity()。
若需要从activity中获得处理的数据,那么使用startActivityForResult()函数,并提供一个int类型的标识符。在被调用的activity返回之后,通过onActivityResult()函数获取之前所需的数据。onActivityResult()函数看起来是需要一个activity自行重写的。
在Activity A启动Activity B的过程中,activity的life cycle如下
(1)A的onPause()函数被调用。
(2)B的onCreate(), onStart(), onResume()函数被调用。
(3)当A在屏幕上不可见时,A的onStop()函数被调用。
一个activity终止有多种情况,当android系统由于资源调度而终止了处于stop状态的activity时,android会保存一份数据,称为instance state。这个instance state是一个Bundle对象。但是默认的行为提供的功能非常有限,为了能够实现activity在重建时能够恢复数据,需要使用onSaveInstanceState()函数和ViewModel类,参考这里。重写onSaveInstanceState()时需要显式调用super的onSaveInstanceState()以保存view。一般要求每个View对象都有明确的android:id。
恢复activity state。恢复时android向onCreate()和onRestoreInstanceState()函数提供之前存储的Bundle对象。若是新创建的avtivity而非恢复的,那么此Bundle对象是null。在onCreate()中需要最先调用super的onCreate()函数。推荐使用onRestoreInstanceState(),此时无需检测Bundle对象是否是null。需要最先调用super的onRestoreInstanceState()。