引用
本节是从《精通android2》中转载,感觉在做了几个anctivity之后,这里的介绍是比较容易理解和记忆的,所以摘在这里,供学习查阅。
Android应用程序的生命周期由系统根据用户需求、可用资源等进行严格管理。例如,用户可能希望启动Web浏览器,但是否启动该应用程序最终由系统决定。尽管系统是最终的决定者,但它会遵从一些既定的和逻辑上的原则来确定是否可以加载、暂停或停止应用程序。如果用户正在操作一个Activity,系统将为该应用程序提供较高的优先级。相反,如果一个Activity不可见,并且系统决定必须关闭一个应用程序来释放资源,它会关闭优先级较低的应用程序。
这与基于Web的J2EE应用程序的生命周期截然不同。J2EE应用程序由运行它们的容器松散地管理。例如,如果一个应用程序空闲了预先设定的时长,J2EE容器可以从内存中删除它。但容器通常不会根据负载或可用的资源在内存中加载和删除应用程序。J2EE容器通常具有足够的资源同时运行多个应用程序。而对于Android,资源更加受限,所以Android必须能够更多和更强有力地控制应用程序。
说明 Android在独立的进程里运行每个应用程序,每个进程都有自己的虚拟机。这提供了一种受保护的内存环境。而且,通过将应用程序隔离到独立进程中,系统可以控制哪个应用程序具有较高优先级。例如,执行CPU密集型任务的后台进程不能阻止拨入的电话。
应用程序生命周期的概念是逻辑上的,但Android应用程序在某些方面可能会使事情变得复杂。具体来讲,Android应用程序层次结构是面向组件和集成的。这支持实现富用户体验、流畅重用和轻松的应用程序集成,但却为应用程序生命周期管理器带来了不便。
我们看一个典型场景。用户通过电话与某人通话,他需要打开一封电子邮件回答一个问题。他转到主屏幕,打开邮件应用程序,打开电子邮件,单击邮件中的一个链接,然后从一个网页读取股票报价来回答他朋友的问题。此场景需要4个应用程序:主页应用程序、通话应用程序、电子邮件应用程序和浏览器应用程序。当用户从一个应用程序转到另一个时,他的体验是流畅的。然而,在后台,系统会保存和恢复应用程序状态。例如,当用户单击电子邮件中的链接时,系统在启动浏览器应用程序Activity来加载一个URL之前,会保存正在运行的电子邮件的元数据。实际上,系统在启动任何Activity之前都会保存另一个Activity的元数据,以便它能够返回到该Activity(例如,当用户取消操作时)。如果内存不足,系统将必须关闭一个运行Activity的进程并在必要时恢复它。
生命周期对Android应用程序及其组件很重要。只有理解和处理好生命周期事件,才能构建稳定的应用程序。运行Android应用程序及其组件的进程会经历各种生命周期事件,Android提供了回调,通过实现它们可以处理状态变化。对于初学者,需要熟悉一个Activity的各种生命周期回调(参见代码清单2-7)。
代码清单2-7 Activity的生命周期方法
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
代码清单2-7显示了Android在一个Activity生命周期内调用的一组生命周期方法。一定要理解系统在何时调用每个方法,才能确保实现稳定的应用程序。请注意,不需要对所有这些方法都做出响应。但是,如果这样做了,一定要确保也调用了超类的相应方法。图2-15展示了各种状态之间的转换。
(点击查看大图)图2-15 Activity的状态转换
系统可以根据发生的其他事件来启动和停止Activity。刚创建Activity时,Android调用onCreate()方法,然后总是会调用onStart(),但调用onStart()之前并不总是会调用onCreate(),因为可以在应用程序停止(调用onStop())之后调用onStart()。当调用onStart()时,Activity对用户不可见,但稍后就会可见。在调用onStart()之后,在Activity处于前台且能供用户访问时调用onResume()。这时,用户就会与Activity交互。
当用户决定转到另一个Activity时,系统将调用当前Activity的onPause()方法,然后可能调用onResume()或onStop()。例如,如果用户将当前Activity调回前台,将调用onResume()。如果Activity变得对用户不可见,将调用onStop()。如果Activity调回了前台,那么在调用onStop()之后,将调用onRestart()。如果Activity位于Activity栈中,但对用户不可见,并且系统决定结束该Activity,那么将调用onDestroy()。
上面介绍的Activity状态模型看起来很复杂,但你没有必要对每一种可能的场景都进行处理。实际上,最常调用的将是onCreate()和onPause()。你将调用onCreate()来为Activity创建用户界面。在此方法中,可以将数据绑定到部件并连接UI组件的任何事件处理程序。在onPause()方法中,你希望将关键数据持久保存到应用程序的数据存储中。onPause()方法是在系统结束应用程序前调用的最后一个安全的方法。无法保证onStop()和onDestroy()会被调用,所以不要依赖这些方法来实现关键逻辑。
从上面的介绍中可以了解到什么?系统管理应用程序,它可以在任何时候启动、停止或恢复应用程序组件。尽管系统控制着应用程序组件,但这些组件的运行并不是与应用程序完全隔离的。换言之,如果系统启动了应用程序中的一个Activity,则能够在该Activity中使用一种应用程序上下文。例如,在应用程序的各种Activity之间,经常会共享一些全局变量。要共享全局变量,可以扩展android.app.Application类,然后在onCreate()方法中初始化该全局变量(参见代码清单2-8)。然后,Activity和应用程序中的其他组件在执行时,可以自由访问这些引用。
代码清单2-8 Application类的扩展
public class MyApplication extends Application
{
// global variable
private static final String myGlobalVariable;
@Override
public void onCreate()
{
super.onCreate();
//... initialize global variables here
myGlobalVariable = loadCacheData();
}
public static String getMyGlobalVariable() {
return myGlobalVariable;
}
}