概要说明
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. Each activity is given a window in which to draw its user interface. The window typically fills the screen, but may be smaller than the screen and float on top of other windows.
Android SDK文档中对Activity的描述,Activity是application的一个组件,它提供了一个页面给用户进行交互为了完成一些工作,例如打电话、照相等,每个activity都有一个窗口去绘制它的用户界面,这个窗口通常是填充满整个屏幕的,但是也有可能更小或者浮在其他窗口之上。
每个应用都有一个“Main”activity,它是整个应用的入口,处在后台stack的底部。每启动一个activity都会将这个activity压入一个后进先出的后台stack中(当然这也和启动模式有关,后面会讲启动模式),当一个activity点击了后退,也就是调用了onDestroy()方法后,该activity被销毁并且出栈,返回到下面的activity中,如果退出的是“Main”activity,那么应用退出。
在Activity中,我们通过setContentView()方法来设置布局,当然也可以在代码中创建新的view,将这个 view插入到viewGroup中,再把这个viewGroup传递给setContentView()来实现多个布局。
生命周期
Managing the lifecycle of your activities by implementing callback methods is crucial to developing a strong and flexible application. The lifecycle of an activity is directly affected by its association with other activities, its task and back stack.
了解Activity的生命周期是非常重要的,在复杂的应用中,我们必须明确在各个生命周期应该做一些什么工作,所以我们需要了解activity每个生命周期会调用什么函数,什么时候调用。
这里可以分三种情况:
entire lifetime:从onCreate()到onDestroy()方法为整个生命周期。
visible lifetime:从onStart()到onStop()方法为可见的生命周期。
foreground lifetime:从onResume()到onPause()方法为前台生命周期,这时该activity是能够获取到用户的焦点并且进行操作的。
单个activity调用:
启动一个activity调用方法:
onCreate()
onStart()
onResume()
按后退键返回手机桌面调用方法:
onPause()
onStop()
点击回到activity调用方法:
onRestart()
onStart()
onResume()
点击退出activity调用方法:
onPause()
onStop()
onDestroy()
两个activity间相互调用:
启动A调用方法:
A.onCreate()
A.onStart()
A.onResume()
通过A启动B(A已经不可见)调用方法:
A.onPause()
B.onCreate()
B.onStart()
B.onResume()
A.onStop()
通过A启动B(A仍可见,例如B只是一个小窗口)调用方法:
A.onPause()
B.onCreate()
B.onStart()
B.onResume()
保存数据
当我们退出activity的时候,可以对状态进行保存,可以从上图看出来,在activity不可见的时候,会调用onSaveInstanceState()方法,该方法保存了一个Bundle数据包,在下次启动该activity时会传递给onRestoreInstanceState()进行状态回复。需要注意的是,并不是一定会调用onSaveInstanceState()方法,例如用户点击了后退键,这是用户主动退出系统会识别不调用onSavaInstanceState(),所以为了安全期间,我们应该在onSavaInstanceState()方法中做一些安全性要求低的状态保存,而把数据保存写在onPause()等方法中。
Tasks and Back Stack
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack), in the order in which each activity is opened.
从文字来理解tasks是任务,用户完成某一件事就是一个任务,这个任务包括了多少个activity,那么这些activity会被安排在一个back stack里面。启动一个应用后,就开启了一个task,也创建了一个back stack,而“Main”activity就在stack的底部,当启动另一个activity时,就压入这个back stack中。一个应用可以启动多个task,当它的activity需要这样做时。
启动模式
这种模式下,每次启动的activity都采用同一个任务栈(这里假设栈号是80),但是每个实例化的activity都在任务栈有不同的序号(序号是随机的,并不是图中显示的有规律)。每启动一个activity都把它的序号压入栈顶,点击返回键就回到上一个序号的位置。
singleTop
这种模式下,每次启动的activity也是采用同一个任务栈(也假设是80),当你要启动的activity位于栈顶时,不会启动一个新的activity(例如你刚启动了一个A,再次点击启动A时,它并不会启动一个新的A)。当此时A这个activity在栈顶时,点击启动B,它会启动一个新的B。此时如果再点击启动A,那么它也会启动一个新的A(因为你刚启动了B,所以在栈顶的是B,我想再次启动A,当然能够成功)。同理,如果点击返回键,会返回上一个启动的activity,也就是栈顶-1位置上的activity。
singleTask
在这种模式下,每次启动的activity也是采用同一个任务栈(也假设是80),同singletop一样,如果你要启动的avtivity位于栈顶,不会启动一个新的activity。不同点是,如果先启动A,再启动B,然后启动A时,并不会实例化一个新的A,而是把B销毁,弹回到原来的A,那么此时栈里会只剩下一个A(B已经被你销毁了),倘若你再点一次后退键,那么程序就会退出(因为你退出了最后一个activity)。那么我们可以知道,任务栈里是不可能出现同一个activity的。如果不存在A,那么它会新创建一个任务来启动A。
singleInstance
在这种模式下,每个activity独占一个任务栈。启动A时,它分配任务栈号80,启动B时,它分配任务栈号81.再启动A时,会回到任务栈80,但是不会实例化一个新的A。也就是,每个avtivity拥有一个任务栈,一个任务栈里拥有一个activity的一个实例。