天天看點

Android 之活動任務堆棧詳解

package com.xiaoma.www; 

import android.app.Activity; 

import android.content.Intent; 

import android.os.Bundle; 

import android.view.View; 

import android.view.View.OnClickListener; 

import android.widget.Button; 

/** 

* @Title: AndroidStackTaskActivity.java 

* @Package com.xiaoma.www 

* @Description: 活動、任務堆棧學習 

* @author XiaoMa 

*/ 

public class AndroidStackTaskActivity1 extends Activity implements OnClickListener{ 

    private Button next = null ;  

    /** Called when the activity is first created. */ 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

        init(); 

    } 

    private void init(){ 

        next = (Button)findViewById(R.id.button1); 

        next.setOnClickListener(this); 

    public void onClick(View v) { 

        // TODO Auto-generated method stub 

        Intent i = new Intent(this,AndroidStackTaskActivity2.class); 

        startActivity(i); 

* @Title: AndroidStackTaskActivity2.java 

public class AndroidStackTaskActivity2 extends Activity  implements OnClickListener { 

        setContentView(R.layout.main2); 

        Intent i = new Intent(this,AndroidStackTaskActivity3.class); 

public class AndroidStackTaskActivity3 extends Activity  implements OnClickListener { 

<a href="http://blog.51cto.com/attachment/201206/160525368.jpg" target="_blank"></a>

        這個地方說明下,有時候大家可以想着從1到2時可以綁定資料完成回顯,但是如果要簡單的回顯用綁定或startActivityForResult()這兩種方式啟動,但是如果涉及到三個以上的活動惑更多活動之間的跳轉時,有時候不得不必須重新啟動新的活動,也就出現了前面的1&gt;&gt;2&gt;&gt;3&gt;&gt;4&gt;&gt;&gt;&gt;&gt;&gt;&gt;甚至更多的活動跳轉,這樣一個個關閉有時候還是關不幹淨,應用退出的時候也還是不幹淨的,更搞笑的是有時候還有使用者在多個活動之間跳轉并不進行任何資料操作時還要求傳回上一個Activity時你就不能直接finish掉上一個Activity,不然人家說你跳轉不對,針對這個問題我們來看下Google提供的堆棧任務控制機制吧,很簡單,用Flag來控制,這個時候就有個問題,提供的方法有setFlag()、addFlag(),這兩個肯定有什麼差別的,不然不會出現兩個控制Flag的方法的,繼續….先看下如下兩種效果:

第一種:未設定Flag時  

<a href="http://blog.51cto.com/attachment/201206/160626999.gif" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201206/160650289.gif" target="_blank"></a>

       如上所示,大家應該看出來了,同樣點選了六次按鈕之後按的傳回鍵,第一種效果必須點選六次Back鍵後方可退出,而第二種效果隻點選一次即可退出,這就是Flag的魅力,激動….再來看Flag都有哪幾種吧,此處我列在這個地方,上面兩個效果中設定的是:i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);另外還有很多可以控制活動堆棧與任務棧的Flag,小馬在這個地方随便列出兩個,剩餘的Flag值以截圖的形式顯示,節約時間:

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)其它:

<a href="http://blog.51cto.com/attachment/201206/160740759.jpg" target="_blank"></a>

Intent i = new Intent(Intent.ACTION_VIEW); 

      i.putExtra("filePath",path); 

     startActivity(i); 

       如果加了 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);操作下任務堆棧就可以了,具體的原因,也可以用一句話來總結:如果在一個Activity中同一時間,要操作不用的功能,比如:跳轉時還要操作視訊錄音檔案的播放什麼的,都得設定新的任務棧來啟動打開,如果不啟動新任務棧的話,有時候會無原無故的顯示空白還不報錯!上面的錯隻是一個小點,小到可以忽略不講,寫在這是提醒大家,該加的時候必須加Flag,至于什麼時候加,大家可以參照下官方的文檔及下面小馬貼出的官方文檔中解釋堆棧的圖解,加以了解學習,如下所示:Figure2:不多解釋,就是在A B 丙個任務堆棧,如果使用者正在于B任務堆棧進行互動時,A在等待喚醒,反之則反

<a href="http://blog.51cto.com/attachment/201206/161004332.jpg" target="_blank"></a>

          Figure3: 下面這個就好玩了,學習了下官方的文檔,講的是:無論啟動了一個新的任務堆棧或者在同一堆棧中來啟動一個活動,按傳回鍵也還是會傳回到使用者之前操作的Activity,如果以單例堆棧(類似機關模式)載入的話,就會在背景生成一個針對于此活動的單獨的一個任務堆棧,當這個任務堆棧被喚醒到前台時,此時的傳回堆棧中就包含了從前幾個任務傳遞過來的棧頂的所有Activity,棧頂與棧底的顯示關系如果下圖:

     本文轉自華華世界 51CTO部落格,原文連結:http://blog.51cto.com/mzh3344258/885587,如需轉載請自行聯系原作者

繼續閱讀