Android :task 与 back stack解读之初步了解.(包括 task,back stack,lauchMode, taskAffinity ,intent flags等解析)

     一、初步了解:

     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


你可能感兴趣的:(stack,intent,task,back,flags,taskAffinity,lauchmode)