天天看點

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資訊。

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

task中有3個activity,base activity 為activity1,top activity 為activity3,與我們的操作是完全一緻的。當我們按back鍵時,從activity3依次回到activity2,activity1,然後回到桌面。此時,back stack已經清空,該task也不再存在。示意圖如下:

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

—— —— —— —— ———— —— —— —— ———— —— —— —— ———— —— —— —— ———— —— —— —— ——

最後是關于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

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