2012年6月28日星期四

Android Task and Back Stack


1.Android中的任务(Task)就是一系列Activity的集合,用来完成一项任务。而这些Activity 是保存在Activity堆栈(此堆栈不允许自己修改)中的。当启动一个Activity时,他会被压入栈中,成为栈顶的Activity, 用于与用户交互。而先前的Activity则会失去焦点,被压入栈中,并保存其状态(最好在生命周期的OnPause方法中保存一些数据)。当用户再次点击Back键时,栈顶的Activity被销毁,先前成为栈顶,与用户交互,此时会执行OnResume方法来恢复数据。

2.尽可能保存用户状态,当系统资源不足时,可能会销毁长时间不用的Activity来释放资源,这时候我们需要实现OnSaveInstanceState()方法来保存一些简单的数据 比如UI状态等,当用户再次启动Activity时,我们可以在OnCreate(Bundle savedInstanceState)方法中根据传递的Bundle来恢复先前的状态。注意:OnSaveInstanceState方法并不是Activity的生命周期中的方法,因此可能不会被调用。

3.如何管理任务
  每个Activity都有一个配置选项来配置启动模式,基本有一下4中:Standard,SingleTop,SingleTask,SingleInstance。我们可以使用这些启动模式来定制自己的逻辑。
  Standard,标准的也是默认的模式。但Intent到来时,系统会创建一个新的实例,不论当前任务是否已经有了此Activity的实例。同时一个实例可以被几个不同的Task使用,一个Task也可以有多个实例。
  SingleTop,置于顶端的。当Intent到来时,系统会判断当前栈顶的是否为需要的Activity的实例,如果是当前的实例,则不会重新创建此Activity的实例,而是调用Activity的OnNewIntent(Intent)回调方法来处理新来的intent,否则的话,系统则会创建一个新的Activity实例来处理Intent。但是要注意,如果栈顶为需要的Activity的实例,并且OnNewIntent处理了Intent,当用户再点击Back键返回时,不会返回到OnNewIntent方法之前的状态,而是销毁此Activity。
 SingleTask ,单个任务。当Activity配置成此模式,有intent到来时,系统会创建一个新的Task来处理Intent,如果已存在此Task,则会调用此Task。注意:如果当前栈顶的为此Activity,当我们按Home键返回到桌面,当我们再启动APP时,此前的Activity已经不存在了。
 SingleInstance,顾名思义即为单一实例。任务中只会存在一个实例。当intent到来,系统会调用Activity的OnNewIntent方法处理。