Activity
(参见:http://blog.sina.com.cn/s/blog_75016706010164wb.html,略有修改)
每一个Activity就是一个屏幕,程序把它呈献给用户。程序越复杂Activity就越多。
典型情况下,至少包含一个用来处理应用程序的主UI功能的主屏幕。这个主屏一般由多个Fragment组成,并且通常是由一组次要Activity支持的。要在主屏之间进行切换,就必须要启动一个新的Activity或者从一个Activity返回。
Activity 的框架代码:
public class MainActivity extends Activity {
/** 第一次创建Activity 是被调用 */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
把一个UI分配给一个Activity 需要在onCreate方法里调用setContentView。
如下:TextView 的一个实例被用成Activity的UI:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
setContentView(tv);
}
要在程序里使用Activity,必须在Manifest里声明一下。
<activity
android:name="com.example.MainActivity">
</activity>
在<activity>标签中,可以添加intent-filter节点来指定能够用来启动该Activity的Intent。每一个Intent-filter 都定义了一个或者多个Activity所支持的动作或者分类。如果让某个Activity可以被程序启动器使用,必须监听MAIN动作和LAUNCHER分类的Intent-filter。
<activity
android:name="com.example.persontest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Activity的生命周期
Android 程序不能控制它们自己的进程的生存期,而android 运行时可以管理每一个应用程序的进程,也就是说,它可以管理进程中的每个Activity。
除了运行时可以终止一个Activity进程并对其进行管理之外,Activity的状态也可以帮助你确定其父应用程序的优先级。而应用程序的优先级又影响着运行时终止进程几其运行的Activity的可能性。
l Activity栈
每一个Activity的状态是由它在Activity栈中所处的位置决定的,Activity栈是所有的正在运行的Activity的后进先出的集合。 当一个新Activity启动时,它就变为Activity状态,并被移动到栈顶。如果用户使用Back键返回到刚才的Activity,或者前台的Activity被关闭了,那么栈中的下一个Activity就会移动到栈顶,变为活动状态。如图:
应用程序的优先级受其最高优先级的Activity的影响。当Android的内存管理器决定终止哪个应用程序来释放资源时,它会使用这个栈来决定应用程序的优先级。
l Activity 的状态
随着Activity的创建和销毁,他们会从栈中移近移出。这个过程它也经历了下面4种可能的状态:
1.活动状态:当一个Activity位于栈顶时,它是可见的、具有焦点的前台Activity,这时它可以接受用户输入。Android 会不惜一切代价来保持它处于活动状态,并根据需要来销毁栈下面部分的Activity,以保证这个Activity拥有它所需要的资源。当另一个Activity变为活动状态时,这个Activity就将被暂停。
2.暂停状态:在某些情况下,Activity是可见的,但是没有获得焦点,此时它处于暂停状态。当一个透明的或者非全屏的Activity位于该Activity之前时,就会达到这个状态。当Activity被暂停的时候,它仍然会被当做近似于活动的状态的状态,但是它不能接收用户的输入事件。在极端的情况,Android会终止暂停的Activity,以便为活动的Activity释放资源。当一个Activity不可见时,它就会变成停止状态。
3.停止状态:当一个Activity不可见的时候,他就处于不可见状态。此时Activity仍然会停留在内存中,保存所有的状态信息,然而当系统的其他地方要求使用内存的时候,它们就会被终止的首要对象。在一个Activity停止的时候,保存数据和当前的UI状态以及停止任何非关键操作是很重要的。一旦一个Activity被退出或者关闭,它就会变为非活动状态。
4.非活动状态:当一个Activity被终止以后,再启动之前它就是处于非活动状态。处于非活动状态的Activity已经从Activity栈中移除了,因此,在它们可以被显示和使用之前,需要被重新启动。
l 监控状态改变
为了保证Activity可以对状态改变作出反应,Android 提供了一系列事件处理程序,当Activity在完整的、可见的和活动的生命周期之间转化时,它们机会触发。
public class MainActivity extends Activity {
/** 在Activity生命周期开始时被调用 */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
//初始化一个Activity 并且填充UI
setContentView(R.layout.activity_main);
}
/********在onCreate 方法完成后调用,用于恢复UI状态***********/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//从savedInstance恢复UI状态
//这个Bundle 也传递给了onCreate
//自Activity上次可见后,只有当系统终止了该Activity时,才会被调用
}
/********当activity从停止状态重新启动时调用************/
//Called after your activity has been stopped, prior to it being started again. Always followed by onStart()
@Override
protected void onRestart() {
super.onRestart();
//加装载改变,知道Activity在此进程中已经可见
}
/********当activity对用户即将可见的时候调用。 **************/
// The activity is about to become visible.
@Override
protected void onStart() {
super.onStart();
//既然Activity可见,就应用任何要求UI change
}
/********当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它 ********/
// The activity has become visible (it is now "resumed").
@Override
protected void onResume() {
super.onResume();
}
/****Activity即将移出栈顶保留UI状态时调用此方法 ***/
//把UI状态改变保存到savedInstanceState
@Override
protected void onSaveInstanceState(Bundle outState) {
//如果进程被运行时终止并被重启,那么这个Bundle将被传递给哦你Create和onRestoreInstanceState
super.onSaveInstanceState(outState);
}
/**
* 当系统要启动一个其他的activity时调用(其他的activity显示之前),
* 这个方法被用来提交那些持久数据的改变、停止动画、和其他占用 CPU资源的东西。
* 由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
* 这是该Activity依然可见 ,但没有焦点
*/
@Override
protected void onPause() {
//当Activity不是前台的活动状态的Activity时,
//挂起不需要跟新的UI跟新、线程或者CPU秘籍的线程
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
// 在可见生存期结束时调用
/**当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。
* 一个新activity启动、其它activity被切换至前景、当前activity被销毁时都 会发生这种场景。
*/
@Override
protected void onStop() {
//当Activity不可见时,挂起不需要的UI更新、线程或处理,
//保存所有的编辑或者状态改变,因为在调用这个方法后,进程可能会被终止
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
//在完整生命周期结束时调用
/**在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况*/
@Override
protected void onDestroy() {
//清理所有资源
//关闭数据库连接等
super.onDestroy();
// The activity is about to be destroyed.
}
}
在一个Activity的完整的生命周期里,既创造和销毁之间,它会经过一个或多个不同状态之间的转移包括从可见的到不可见,从Active到Inactive。每一次状态的转移都将触发以上这些事件。
Activity完整的生命周期
完整的Activity生命周期之间从调用的OnCreate开始,到调用onDestroy结束。有可能在某些情况下,一个Activity被终止时并不调用onDestroy方法。使用OnCreate方法来初始化你的Activity:初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程。在OnCreate方法传递的对象Bundle包含最后一次调用onSaveInstanceState保存的UI状态。你可以使用这个Bundle恢复用户界面到以前的状态,无论是在OnCreate方法或通过覆盖onRestoreInstanceStateMethod方法。覆盖onDestroy方法来清理OnCreate中创建的任何资源,并确保所有外部连接被关闭,例如网络或数据库的联系。为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响。如果你的Activity需要创建一些对象的话,最好在onCreate方法中创建,因为它仅调用一次在一个Actvity的完整生命周期中。
Activity可见的生命周期
一个Activity可见的生命周期始于OnStart调用,结束于OnStop调用。在这两个方法中间,你的Actvity将会对用户是可见的,尽管它可能没有焦点,也可能部分被遮挡着。在一个Activity完整的生命周期中可能会经过几个Activity可见的生命周期,因为你的Activity可能会经常在前台和后台之间切换。在极端情况下,OPhone Runtime将杀掉一个Activity即使它在可见状态并且并不调用onStop方法。
OnStop方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序。当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序,。
onRestart方法优先于onStart被调用当一个Activity被重现可见时,使用它你可以实现一些Activity重新可见时的特殊的处理。
OnStart / OnStop方法也被用来注册和注销专门用于更新用户界面Intent接收者。
Activity活跃的生命周期
一个Activity活跃的生命周期始于OnResume调用,结束于OnPause调用。一个活跃的Actvity总是在前台并且接收用户输入事件。当一个新的Actvity启动,或该设备进入休眠状态,或失去焦点,Activity活跃的生命周期就结束了。尽量在onPause和onResume方法中执行较量轻的代码以确保您的应用程序能够快速响应Acitvity在前台和后台之间切换。在调用onPause之前,onSaveInstanceState会被调用。这个方法提供了一个机会保存当前的UI状态到Bundle当中。 Bundle信息将会被传递到OnCreate和onRestoreInstanceState方法。使用onSaveInstanceState保存 UI状态(如检查按钮状态,用户焦点,未提交用户输入)能够确保目前相同的用户界面当Activity下次被激活时。在Activity活跃生命周期中,你可以安全地认为onSaveInstanceState和onPause将被调到即使当前进程将终止。