一、初步了解:
Android应用程序通常由许多activity组成。比如说,一个邮件程序有一个activity显示邮件列表,当用户点击了一项后,会打开一个新的activity展示邮件详细内容。Task就是一系列activity的集合;这些activity按打开的顺序被放入栈中,这个栈叫做back stack。当用户按back键时,activity依次从栈弹出,并销毁。手机的桌面屏幕就是一个开始task的地方,当用户点击应用的图标,该应用的task会进入前台;如果没有task存在,一个新的task将会建立,应用的main activity会作为base activity 放入back stack中。我们写一个简单的demo来体会一下:
public class BaseActivity extends Activity { ActivityManager mAm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAm = (ActivityManager) this.getSystemService(this.ACTIVITY_SERVICE); } // 运行中的任务 public void showRunningTasks() { List<ActivityManager.RunningTaskInfo> taskList = mAm.getRunningTasks(100); for (ActivityManager.RunningTaskInfo rti : taskList) { if(rti.topActivity.getPackageName().equals(this.getPackageName())) { System.out.println("Task:"+"id=" + rti.id); System.out.println("description=" + rti.description); System.out.println("numActivities=" + rti.numActivities); System.out.println("baseActivity=" + rti.baseActivity.getClassName()); System.out.println("topActivity=" + rti.topActivity.getClassName()); } } } }
权限:
<uses-permission android:name="android.permission.GET_TASKS"/> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/> <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"/>
如上所示为demo的baseactivity ,所有的activity 都继承这个baseactivity,提供了一个方法showRunningTasks,会打印应用的task信息,包括id,描述,activity数目,栈的base activity(启动activity,位于栈底部)和top activity(也就是目前为止最后打开的activity,位于栈顶部)等信息。
public class Activity_1 extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent=new Intent(this,Activity_2.class); startActivity(intent); } }
public class Activity_2 extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent=new Intent(this,Activity_3.class); startActivity(intent); } }
public class Activity_3 extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showRunningTasks(); } }如上所示为最简单的一个例子,activity1启动,然后跳转到activity2,然后跳转到activity3,并打印当前的task信息。
task中有3个activity,base activity 为activity1,top activity 为activity3,与我们的操作是完全一致的。当我们按back键时,从activity3依次回到activity2,activity1,然后回到桌面。此时,back stack已经清空,该task也不再存在。示意图如下:
—— —— —— —— ———— —— —— —— ———— —— —— —— ———— —— —— —— ———— —— —— —— ——
最后是关于task的默认行为的一些总结:
1、当activity A启动activity B时,A将会stop,但是系统保存了它的状态信息(滑动位置,输入的文字等)。如果用户在B中按back键,A将会resume,并恢复状态。
2、当用户通过按home键离开一个task,当前activity stop,该task进入后台。系统将会保持每个activity的状态。如果用户通过应用图标或者最近使用屏幕resume 该
task时,task进入前台,并且resume back stack 顶部的activity。
3、如果用户按了back键,当前的activity将会从back stack 弹出,并destroy,系统将不会保存该activity的状态信息;之前的activity将会resume,呈现给用户。
4、一个activity可以被实例化很多次,甚至位于不同的task中。
5、当task处于后台时,当系统内存不足时,可能会被系统回收某些activity。当这些activity重新进入前台时,系统会create而不是resume它。这个时候,状态信息将不会存在。可以回调onSaveInstanceState()方法,来保存信息;onRestoreInstanceState() 方法来恢复信息。详细可以参考:http://blog.csdn.net/caesardadi/article/details/20382815