Activity的基本信息-第一篇
Activity的定义
An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).
Activity是Android的四大组件(Activity 活动、Service 服务、BroadcastReceive 广播接收器、Content Provider 活动)之一, 是Android开发中使用最为频繁的一种组件。Activity提供了一个窗口以供应用在其中绘制界面、和应用进行交互,这个窗口通常会占满整个屏幕的空间,但也可以比屏幕小,并在其他窗口上浮动显示。
任务和返回栈
在Android系统中,使用Task(任务)来对Activity进行统一的管理。一个Task就是一组存放在栈里的Activity的集合,这些Activity会按照启动顺序依次存入栈中,这个栈称为返回栈(Back Stack),系统会将处以返回栈栈顶的Activity展示给用户。Android系统默认会为每个应用维持一个Task以存放该应用中使用的所有Activity,并且该Task的默认name为该应用的包名。
栈是一个后进先出的数据结构。在默认情况下,每当我们启动一个Activity,该Activity会在返回栈中入栈,并处于栈顶的位置,展示在前台与用户进行交互。而当我们按下Back键或调用Activity类中的finish()方法来销毁一个Activity时,返回栈栈顶的Activity会出栈,前一个入栈的Activity会重新处于栈顶的位置与用户进行交互。
Activity的生命周期
以上图片是Android开发者官网中对Activity生命周期的简化图示。
为了在Activity生命周期的各个阶段进行转化,Activity类提供了6个核心回调方法:
-
onCreate()
在Activity第一次被创建时调用。通常在该方法中完成活动的初始化操作,例如加载布局、进行事件的绑定等等
-
onStart()
当Activity由不可见变为可见状态时调用。可以在该方法初始化维护界面的代码。
-
onResume()
该方法会在Activity准备好与用户进行交互的时候调用,Activity进入运行状态。此时Activity一定位于返回栈的栈顶位置,并且处于运行状态。
-
onPause()
该方法会在系统准备启动或切换到另一个Activity时调用(Activity不再位于前台位置),Activity进入暂停状态。通常在该方法对一些关键的数据进行保存、释放系统资源。
-
onStop
当Activity完全不可见时会调用该方法,Activity进入停止状态。在该方法中释放或调整一些不可见时的无用资源,例如动画效果,以及对一些数据进行保存
-
onDestroy()
在销毁Activity之前,系统会先调用onDestroy(),Activity进入销毁状态。
-
onRestart()
当Activity由停止状态转变为运行状态之前调用。
Activity的启动模式
Activity的启动模式简单的说就是定义Activity实例与Task的关联方式。Activity的启动模式一共有4种,分别是startard、singleTop、singleTask和singleInstance。
-
“standard” (默认模式)
当通过这种模式来启动Activity时, Android总会为目标 Activity创建一个新的实例,并将该Activity添加到当前Task栈中。这种方式不会启动新的Task,只是将新的 Activity添加到原有的Task中。
-
“singleTop”
该模式和standard模式基本一致,但有一点不同:当将要被启动的Activity已经位于Task栈顶时,系统不会重新创建目标Activity实例,而是直接复用Task栈顶的Activity。
-
“singleTask”
Activity在同一个Task内只有一个实例。如果将要启动的Activity不存在,那么系统将会创建该实例,并将其加入Task栈顶;如果将要启动的Activity已存在,且存在栈顶,直接复用Task栈顶的Activity。如果Activity存在但是没有位于栈顶,那么此时系统会把位于该Activity上面的所有其他Activity全部移出Task,从而使得该目标Activity位于栈顶。
-
“singleInstance”
无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例且会用一个全新的Task栈来装载该Activity实例(全局单例)。如果将要启动的Activity不存在,那么系统将会先创建一个全新的Task,再创建目标Activity实例并将该Activity实例放入此全新的Task中。如果将要启动的Activity已存在,那么无论它位于哪个应用程序,哪个Task中;系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。
可以通过以下两种方法来指定Activity的启动模式。
-
在AndroidManifest.xml中通过activity元素的launchMode属性进行指定。
<activity ...... android:launchMode="standard" > ....... </activity>
-
通过Intent中的setFlags()传递相应的标志,以指定Activity的启动模式
Intent intent = new Intent(this,NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
可以通过标志修改的默认模式有哪些?
FLAG_ACTIVITY_NEW_TASK
与"singleTask"模式相同,在新的 task 中启动 activity。如果要启动的 activity 已经运行于某 task 中,则那个 task 将调入前台。FLAG_ACTIVITY_SINGLE_TOP
与 "singleTop"模式相同,如果要启动的 activity位于back stack 顶,系统不会重新创建目标Activity实例,而是直接复用Task栈顶的Activity。FLAG_ACTIVITY_CLEAR_TOP
**此种模式在launchMode中没有对应的属性值。**如果要启动的 activity 已经在当前 task 中运行,则不再启动一个新的实例,且所有在其上面的 activity 将被销毁。