Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中Activity四種加載模式

Android中Activity四種加載模式

編輯:關於Android編程

Activity四種加載模式

我們知道在配置Activity的時候可以指定android:lauchMode屬性,該屬性用於配置該Activity的加載模式,概述行支持以下四種:
1.standard: 標准模式,這是默認的加載模式.
2.singleTop: Task頂單例模式. 3.singleTask: Task內單例模式.
4.singleInstance: 全局單例模式.


那麼Activity為什麼需要制定加載模式呢?
由於在Android上啟動一個應用後,系統會自動的創建一個屬於該應用的Task,也可以理解為Activity棧,先創建的Activity在棧底,後創建的在棧頂部,而Android並沒有為我們提供操作Task的相關API,我們無法直接去操作這個Task,只能通過控制Activity的加載模式來控制Activity與Task之間的加載關系了.

1.standard模式
以這種模式啟動的Activity會創建一個新的Activity實例,並加入到已存在的Task棧中,這種模式不會啟動新的.
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        this.setContentView(ll);

        TextView tv = new TextView(this);
        tv.setText("Activity為: " + this.toString()
                + "\n" + ", Task ID 為:" + this.getTaskId());

        Button button = new Button(this);
        button.setText("啟動Activity");
        ll.addView(tv);
        ll.addView(button);

        button.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(MainActivity.this, MainActivity.class);
                        startActivity(intent);
                    }
                }
        );
    }

}
\\\
由於Activity默認的加載模式就是這種,所以不用再AndroidManifest.xml文件中去定義.每次點擊按鈕之後,都會生成一個新的Activity並加入到棧中,在生成多個之後,不停地按back鍵,可以看到棧中的Activity一個一個的顯示出來.仔細觀察每個Activity的HashCode值會有不同,但TaskId都是相同的,說明不會創建新的Task.


2.singleTZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcMSjyr0KPGJyPgogICAgICAg1eLW1sSjyr20tL2otcRBY3Rpdml0edKyyse6zXN0YW5kYXJk0rvR+daxvdO3xdW7tqUssrvNrNautKbU2tPaLHNpbmdsZVRvcMSjyr3U2sb0tq9BY3Rpdml0edaux7C74bzssuK1scew1bu2pUFjdGl2aXR5yse38brNtbHHsNDo0qrG9LavtcRBY3Rpdml0ecrHzazSu8DgLMjnufvKx82s0rvA4CzPtc2zvavWsb3TuLTTw9LRvq3TtdPQtcRBY3Rpdml0eSyyu8rHzazSu8Dg1PK74brNc3RhbmRhcmTEo8q90rvR+bS0vajSu7j2QWN0aXZpdHm3xbW91bu2pS48YnI+Cjxicj4KPGJyPgq0+sLrus3Jz8PmtcTSu8Sj0rvR+SzQ6NKq1NpBbmRyb2lkTWFuaWZlc3QueG1s1tC808jrIGFuZHJvaWQ6bGF1bmNoTW9kZT0="singleTop"
\

不管怎麼點擊按鈕,,,,都不會有反應的.


3.singleTask模式
singleTask模式在加載Activity的時候,只允許同一個Task中存在該Activity的一個實例.創建的時候分三種情況考慮:
1.如果Task中不存在該Activity的實例,則創建一個加入其中
2.如果Task中存在並且正好位於棧頂,則與singleTop模式操作方法相同,沒有反應.
3.如果存在Task中,並且不在棧頂,則先將Task中位於該Activity之上的Activity全部彈出,使其置於棧頂.

注意在AndroidManifest.xml文件中做出相應的更改.
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        this.setContentView(ll);

        TextView tv = new TextView(this);
        tv.setText("Activity為: " + this.toString()
                + "\n" + ", Task ID 為:" + this.getTaskId());

        Button button = new Button(this);
        button.setText("啟動Activity");
        ll.addView(tv);
        ll.addView(button);

        button.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        startActivity(intent);
                    }
                }
        );
    }
}

public class SecondActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        this.setContentView(ll);

        TextView tv = new TextView(this);
        tv.setText("Activity為: " + this.toString()
                + "\n" + ", Task ID 為:" + this.getTaskId());

        Button button = new Button(this);
        button.setText("啟動Activity");
        ll.addView(tv);
        ll.addView(button);

        button.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(SecondActivity.this,MainActivity.class);
                        startActivity(intent);
                    }
                }
        );
    }
}

點擊第一個activity中的按鈕後,會啟動第二個activity,在第二個activity中點擊按鈕,會將第二個activity中彈出,顯示出第一個activity.在第一個activity中按下back按鍵,會直接退出程序,這就說明第二個activity消失了.如果是在第二個activity中按下back鍵,則會回退到第一個activity中去.



4.singleInstance模式
這個加載模式會和前面幾個有較大的區別,系統保證無論從哪個Task中啟動目標activity,智慧創建一個目標activity實例,並會使用一個全新的Task棧來存放該實例.在創建的時候分如下的兩種情況:
1.目標Activity沒有實例存在於Task中,則創建目標Activity實例後,存放在一個單獨的Task中. 2.存在實例於Task中,不管是哪個Task(不管是後面創建的Task還是主程序在最初創建的Task),系統都會將那個Task轉入前台,使其顯示出來.

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        this.setContentView(ll);

        TextView tv = new TextView(this);
        tv.setText("Activity為: " + this.toString()
                + "\n" + ", Task ID 為:" + this.getTaskId());

        Button button = new Button(this);
        button.setText("啟動Activity");
        ll.addView(tv);
        ll.addView(button);

        button.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        startActivity(intent);
                    }
                }
        );
    }
}

public class SecondActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        this.setContentView(ll);

        TextView tv = new TextView(this);
        tv.setText("Activity為: " + this.toString()
                + "\n" + ", Task ID 為:" + this.getTaskId());

        Button button = new Button(this);
        button.setText("啟動Activity");
        ll.addView(tv);
        ll.addView(button);

        button.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent();
                        intent.setAction("org.crazyit.intent.action.CRAZYIT_ACTION");
                        startActivity(intent);
                    }
                }
        );
    }
}

 
            
                
                
            
        
\\

可以看到在啟動了第二個Activity之後,其Task ID變化了,而在第二個Activity正在顯示的時候,點擊按鈕沒什麼反應.回退到第一個activity再創建第二個Acitivity,Task的ID又出現了不同的數值.

熟悉了上面的四種加載模式之後,我們就能很方便的管理Activity和Task之間的關系了~~~

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved