Android,android官網

來源:互聯網
上載者:User

Android,android官網

每個Activity都有taskAffinity屬性,這個屬性指出了它希望進入的Task。如果一個Activity沒有顯式的指明該Activity的taskAffinity,那麼它的這個屬性就等於Application指明的taskAffinity,如果Application也沒有指明,那麼該taskAffinity的值就等於包名。而Task也有自己的affinity屬性,它的值等於它的根Activity的taskAffinity的值。

一開始,建立的Activity都會在建立它的Task中,並且大部分都在這裡度過了它的整個生命。然而有一些情況,建立的Activity會被分配其它的Task中去,有的甚至,本來在一個Task中,之後出現了轉移。我們首先分析一下android文檔給我們介紹的兩種情況。 One                                                                                    

如果該Activity的allowTaskReparenting設定為true,它進入後台,當一個和它有相同affinity的Task進入前台時,它會重新宿主,進入到該前台的task中。

我們驗證一下這種情況。

Application Activity taskAffinity allowTaskReparentingapplication1 Activity1 com.winuxxan.affinity trueapplication2 Activity2 com.winuxxan.affinity false

我們建立兩個工程,application1和application2,分別含有Activity1和Activity2,它們的taskAffinity相同,Activity1的allowTaskReparenting為true。

    首先,我們啟動application1,載入Activity1,然後按Home鍵,使該task(假設為task1)進入後台。然後啟動application2,預設載入Activity2。

    我們看到了什麼現象?沒錯,本來應該是顯示Activity2,但是我們卻看到了Activity1。實際上Activity2也被載入了,只是Activity1重新宿主,所以看到了Activity1。Two                                                                                    

如果載入某個Activity的intent,Flag被設定成FLAG_ACTIVITY_NEW_TASK時,它會首先檢查是否存在與自己taskAffinity相同的Task,如果存在,那麼它會直接宿主到該Task中,如果不存在則重新建立Task。

我們來做一個測試。

我們首先寫一個應用,它有兩個Activity(Activity1和Activity2),AndroidManifest.xml如下:

<application android:icon="@drawable/icon" android:label="@string/app_name">      <activity android:name=".Activity1"                android:taskAffinity="com.winuxxan.task"                android:label="@string/app_name">      </activity>      <activity android:name=".Activity2">          <intent-filter>              <action android:name="android.intent.action.MAIN" />              <category android:name="android.intent.category.LAUNCHER" />          </intent-filter>      </activity>  </application>
Activity2的代碼如下:
public class Activity2 extends Activity {           private static final String TAG = "Activity2";           @Override          protected void onCreate(Bundle savedInstanceState) {               super.onCreate(savedInstanceState);               setContentView(R.layout.main2);             }                           @Override          public boolean onTouchEvent(MotionEvent event) {               Intent intent = new Intent(this, Activity1.class);               intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);               startActivity(intent);               return super.onTouchEvent(event);           }       }
然後,我們再寫一個應用MyActivity,它包含一個Activity(MyActivity),AndroidManifest.xml如下:
<application android:icon="@drawable/icon" android:label="@string/app_name">      <activity android:name=".MyActivity"                android:taskAffinity="com.winuxxan.task"                android:label="@string/app_name">          <intent-filter>              <action android:name="android.intent.action.MAIN"/>              <category android:name="android.intent.category.LAUNCHER"/>          </intent-filter>      </activity>

我們首先啟動MyActivity,然後按Home鍵,返回到案頭,然後開啟Activity2,點擊Activity2,進入Activity1。然後按返回鍵。

    我們發現,我們進入Activity的順序為Activity2->Activity1,而返回時順序為Activity1->MyActivity。這就說明了一個問題,Activity1在啟動時,重新宿主到了MyActivity所在的Task中去了。singleTask與taskAffinity                                                            

當一個應用程式載入一個singleTask模式的Activity時,首先該Activity會檢查是否存在與它的taskAffinity相同的Task。

1、如果存在,那麼檢查是否執行個體化,如果已經執行個體化,那麼銷毀在該Activity以上的Activity並調用onNewIntent。如果沒有執行個體化,那麼該Activity執行個體化併入棧。

2、如果不存在,那麼就重新建立Task,併入棧。singleInstance與taskAffinity                                                       

1、當一個應用程式載入一個singleInstance模式的Activity時,如果該Activity沒有被執行個體化,那麼就重新建立一個Task,併入棧,如果已經被執行個體化,那麼就調用該Activity的onNewIntent;

2、singleInstance的Activity所在的Task不允許存在其他Activity,任何從該Activity載入的其它Actiivty(假設為Activity2)都會被放入其它的Task中,如果存在與Activity2相同affinity的Task,則在該Task內建立Activity2。如果不存在,則重建新的Task併入棧。我是天王蓋地虎的分割線                                                             

 

 

參考:http://blog.csdn.net/way_ping_li/article/details/8680359


android:id

android:id="@+id/layout01":定義了布局的變數名稱為layout01,會自動寫進R.java,在R.java檔案中會產生內部類id,可在主程式裡面調用R.id.layout01來擷取這個布局變數實體。
android:orientation="vertical":這個布局是垂直布局。水平布局的話是horizontal
 
android:id

android:id="@+id/layout01":定義了布局的變數名稱為layout01,會自動寫進R.java,在R.java檔案中會產生內部類id,可在主程式裡面調用R.id.layout01來擷取這個布局變數實體。
android:orientation="vertical":這個布局是垂直布局。水平布局的話是horizontal
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.