Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Activity啟動模式詳解(二)--->singleTask

Activity啟動模式詳解(二)--->singleTask

編輯:關於Android編程

MainActivity如下: [java]   package cc.testlaunchmode2;      import android.os.Bundle;   import android.view.View;   import android.view.View.OnClickListener;   import android.widget.Button;   import android.widget.TextView;   import android.app.Activity;   import android.content.Intent;   /**   * Demo描述:   * Activity加載模式詳解   * 在該Demo中主要討論singleTask   *    * 技術描述:   * Activity有四種加載模式-->   * 1 standard: 標准(默認)模式   *   當通過這種模式來啟動Activity時,Android總會為目標   *   Activity創建一個新的實例,並將該Activity添加到當前   *   Task棧中.注意,這種方式不會啟動新的Task,只是將新的   *   Activity添加到原有的Task   *      * 2 singleTop: Task頂單例模式   *   該模式和standard模式基本一致,但有一點不同:當將要被   *   啟動的Activity已經位於Task棧頂時,系統不會重新創建   *   目標Activity實例,而是直接復用Task棧頂的Activity   *      * 3 singleTask: Task內單例模式   *   采用該加載模式時,Activity在同一個Task內只有一個實例.   *   當系統采用singleTask模式加載Activity時,又分為以下   *   三種情況:   *   (1)如果將要啟動的Activity不存在,那麼系統將會創建該   *      實例,並將其加入Task棧頂   *   (2)如果將要啟動的Activity已存在,且存在棧頂,那麼此時   *      與singleTop模式的行為相同   *   (3)如果將要啟動的Activity存在但是沒有位於棧頂,那麼   *      此時系統會把位於該Activity上面的所有其他Activity   *      全部移出Task,從而使得該目標Activity位於棧頂   *         * 4 singleInstance: 全局單例模式   *   在此種加載模式下,無論從哪個Task中啟動目標Activity,只會   *   創建一個目標Activity實例且會用一個全新的Task棧來裝載該   *   Activity實例.   *   當系統采用singleInstance模式加載Activity時,又分為以下   *   兩種情況:   *   (1)如果將要啟動的Activity不存在,那麼系統將會先創建一個   *      全新的Task,再創建目標Activity實例並將該Activity實例   *      放入此全新的Task中   *   (2)如果將要啟動的Activity已存在,那麼無論它位於哪個應用   *      程序,哪個Task中;系統都會把該Activity所在的Task轉到   *      前台,從而使該Activity顯示出來   *    * Android對於Activity的管理方式-->   * Android采用Task來管理多個Activity.   * 當啟動一個APP時,Android就會為之創建一個Task   * 然後啟動這個應用的入口Activity.   * 但是Android並沒有為Task提供API,開發者無法真正   * 地訪問Task,只能調用Activity的getTaskId()方法來   * 獲取其所在的Task的ID.事實上,我們可以把Task理解成   * Activity棧,Task以棧的形式來管理Activity:將不斷啟   * 動的Activity壓入棧.即:先啟動的Activity被放入棧底,   * 後啟動的Activity放在Task棧頂   *    * 測試步驟及解釋:   * 1 進入MainActivity,點擊按鈕進入AnotherActivity.   * 2 此時在AnotherActivity界面.目前在Task棧中有兩個   *   Activity.由下至上為:MainActivity-->AnotherActivity   * 3 在AnotherActivity界面點擊按鈕,系統以標准模式   *   再次加載一個MainActivity   * 4 此時在MainActivity界面.目前在Task棧中有三個Activity.   *   由下至上為:MainActivity-->AnotherActivity-->MainActivity   * 5 此時在MainActivity界面,再點擊按鈕准備進入AnotherActivity   *   系統將以singleTask模式再次加載AnotherActivity.正因為   *   是以singleTask模式加載,所以會清除AnotherActivity上部   *   的所有Activity.   * 6 此時在AnotherActivity界面.目前在Task棧中有兩個   *   Activity.由下至上為:MainActivity-->AnotherActivity   *   這就和第二步的狀態一致了   *    * 備注說明:   * 注意配置文件   * android:launchMode="standard"   * android:name="cc.testlaunchmode2.MainActivity"   * ...............................................   * android:launchMode="singleTask"   * android:name="cc.testlaunchmode2.AnotherActivity"   *    * 參考資料:   * Android瘋狂講義(第二版)   * Thank you very much   */   public class MainActivity extends Activity {       private Button mButton;       private TextView mTextView;       @Override       protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);           init();       }              private void init(){           mTextView=(TextView) findViewById(R.id.textView);           mTextView.setText("當前Activity:"+"\n"+this.toString()+"\n"+"當前TaskId:"+this.getTaskId());           mButton=(Button) findViewById(R.id.button);           mButton.setOnClickListener(new OnClickListener() {               @Override               public void onClick(View view) {                   Intent intent=new Intent(MainActivity.this, AnotherActivity.class);                   startActivity(intent);               }           });       }                    }     AnotherActivity如下: [java]   package cc.testlaunchmode2;      import android.os.Bundle;   import android.view.View;   import android.view.View.OnClickListener;   import android.widget.Button;   import android.widget.TextView;   import android.app.Activity;   import android.content.Intent;      public class AnotherActivity extends Activity {       private Button mButton;       private TextView mTextView;       @Override       protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.another);           init();       }              private void init(){           mTextView=(TextView) findViewById(R.id.textView);           mTextView.setText("當前Activity:"+"\n"+this.toString()+"\n"+"當前TaskId:"+this.getTaskId());           mButton=(Button) findViewById(R.id.button);           mButton.setOnClickListener(new OnClickListener() {               @Override               public void onClick(View view) {                   Intent intent=new Intent(AnotherActivity.this, MainActivity.class);                   startActivity(intent);               }           });       }             }     main.xml如下: [html]   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:tools="http://schemas.android.com/tools"       android:layout_width="match_parent"       android:layout_height="match_parent"      >          <TextView           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="Activity加載模式詳解"            android:layout_centerHorizontal="true"       />              <Button           android:id="@+id/button"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="以singleTask方式啟動AnotherActivity"            android:layout_centerHorizontal="true"           android:layout_marginTop="100dip"           />              <TextView           android:id="@+id/textView"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_centerInParent="true"        />      </RelativeLayout>     another.xml如下: [html]   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:tools="http://schemas.android.com/tools"       android:layout_width="match_parent"       android:layout_height="match_parent"      >          <TextView           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="Activity加載模式詳解"            android:layout_centerHorizontal="true"       />              <Button           android:id="@+id/button"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="以standard方式啟動MainActivity"            android:layout_centerHorizontal="true"           android:layout_marginTop="100dip"           />              <TextView           android:id="@+id/textView"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_centerInParent="true"        />      </RelativeLayout>     AndroidManifest.xml如下: [html]   <?xml version="1.0" encoding="utf-8"?>   <manifest xmlns:android="http://schemas.android.com/apk/res/android"       package="cc.testlaunchmode2"       android:versionCode="1"       android:versionName="1.0" >          <uses-sdk           android:minSdkVersion="14"           android:targetSdkVersion="14" />          <application           android:allowBackup="true"           android:icon="@drawable/ic_launcher"           android:label="@string/app_name"           android:theme="@style/AppTheme" >           <activity               android:launchMode="standard"               android:name="cc.testlaunchmode2.MainActivity"               android:label="@string/app_name" >               <intent-filter>                   <action android:name="android.intent.action.MAIN" />                      <category android:name="android.intent.category.LAUNCHER" />               </intent-filter>           </activity>                      <activity                 android:launchMode="singleTask"               android:name="cc.testlaunchmode2.AnotherActivity">           </activity>       </application>      </manifest>      
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved