Kesco的编码世界

Android下的任务与Activity栈

我们都知道,通过Intent启动Activity有两种形式:

  1. 显式的指向某个Activity
  Intent intent = new Intent(this, Activity1.class);
  startActivity(intent); 
  1. 隐式的通过设置Intent的动作启动Activity
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setData(Uri.parse("http://www.google.com"));
  startActivity(intent);

Activty是Android四大组件中负责与用户交互的部件,Activity承担了大量的显示和交互工作,从某种角度上将,我们看见的应用程序就是许多个Activity的组合。

Task Stack

为了让这许多Activity协同工作而不至于产生混乱,Android平台设计了一种堆栈机制用于管理Activity,其遵循先进后出的原则,系统总是显示位于栈顶的Activity,从逻辑上将,位于栈顶的Activity也就是最后打开的Activity,这也是符合逻辑的。这个栈也可以叫做Task Stack,因为一个Task Stack里的Activity是可以属于不同的Application的。例如:你想在发送短信时,拍一张照并作为彩信发出去,这时你首先停留在短信应用程序的的Acitivity上,然后跳转到Camera应用程序的Activity上,当完成拍照功能后,再返回到短信应用程序的Activity。这实际上是两个Android Application协同合作后完成的工作,但为了更好的用户体验,Android平台加入了Task这么一种机制,让用户没有感觉到应用的中断,让用户感觉在一“应用程序”里就完成了想完成的工作。

通过下图可以更清晰的理解Application、task、Activity三者之间的关系:

Application-task-Activity

值得注意点的时候,一个系统里可以有很多的Task Stack,当后台的Task过多的时候,系统可能会去除栈底的Activity,释放多余的内存。

保存Activity状态

当Task Stack中的Activity返回前台的时候,可能已经是被系统释放点重新创建的,为了用户的操纵信息得到保留,我们最好重写onSaveInstanceState()方法。

Managing Tasks

我们在平常写程序的时候,Activity的启动方式保持默认就已经够用了。但是遇到特定场合,我们可以通过对启动方式的更改来修改Activity在Task中的运行状态。

Activity的启动状态我们可以在AndroidManifest.XML中定义,抑或直接通过Intent传相应的数值对。

#笔记