1. 程式人生 > >Android學習歷程--Activity的四種啟動模式

Android學習歷程--Activity的四種啟動模式

我們都知道Activity有四種啟動模式,那麼什麼是個啟動模式呢?
所謂的啟動模式就是Activity的啟動策略
啟動模式有4種,分別為standard、singleTop、singleTask、singleInstance;
在講解啟動模式之前我們應該先了解“任務棧”的概念
一.任務棧
1.什麼是任務棧
任務棧是用於只存放一組應用activity的集合。
這裡寫圖片描述
2.任務棧的特點
**(1) 任務棧只存放四大元件中的activity
(2)使用者看到的介面是被放置在任務棧當中的。**
二.四種啟動模式
1.standard
標準啟動模式,每次啟用Activity時都會建立Activity,並放入任務棧中。


圖解:
這裡寫圖片描述
例項:
我們做一個簡單的小程式就可以
activity_layout的程式碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" >
<TextView android:id
="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content"/>
<Button android:id="@+id/btn_skip" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="跳轉到MainActivity"/> </LinearLayout>

Mainactivity.java中的程式碼

package bzu.edu.cn.myapplication;
        import android.content.Intent;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    private TextView textview;
    private Button button;
    private  Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.tv);
        textView.setText(this.toString());
        Button button = (Button) findViewById(R.id.btn_skip);

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

當程式啟動時顯示的畫面是這樣的
這裡寫圖片描述
點選跳轉按鈕時顯示的是
這裡寫圖片描述
這時任務棧中存在兩個Activity 我們可以看到我們得到的地址是不同的,當我們點選返回鍵是 反回的是第一張的畫面 然後再點選一次返回鍵才能退出
這樣我們就能得到standard啟動模式的特點
每次都會建立新的Activity物件,當點選返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳到下一層,例如如果現在Activity是44ed8c50,那麼當我們點選返回時Activity會變為44f28a48,不過此時在這個Activity中再次點選按鈕建立物件時,它會另外建立新的Activity物件,這種模式可能大多數情況下不是我們需要的,因為對系統性能的消耗過大。
2.singleTop
如果在任務的棧頂正好存在該Activity的例項, 就重用該例項,否者就會建立新的例項並放入棧頂(即使棧中已經存在該Activity例項,只要不在棧頂,都會建立例項)。
圖解:
這裡寫圖片描述
例項:
我們還是使用上面的例子 只需要把AndroidMainfest.xml檔案中的程式碼修改一下就可以

 <activity android:name=".MainActivity"
                 android:launchMode="singleTop" >
                 這是修改的之後的程式碼 

程式啟動後的畫面是這樣的
這裡寫圖片描述
**當點選按鈕時 上面所顯示的地址是不變的,因為這時該Activity是在任務棧的棧頂 所以並不會建立新的例項 點選一次返回鍵就可以退出到桌面
雖然它不會建立新的Activity物件,不過它每次回撥用onNewIntent()方法:**
利用這個特點我們就可以做一個點選按鈕顯示當前日期的小程式
再按鈕點選事件的方法中新增如下程式碼

         Toast.makeText(this, new Date().toString(), 1).show();  

3.singleTask
如果在棧中已經有該Activity的例項,就重用該例項(會呼叫例項的onNewIntent())。重用時,會讓該例項回到棧頂,因此在它上面的例項將會被移除棧。如果棧中不存在該例項,將會建立新的例項放入棧中。
圖解:
這裡寫圖片描述
例項:
同上只需修改一段程式碼

android:launchMode="singleTask"

執行效果圖
這裡寫圖片描述
點選按鈕也是不會有什麼變化 因為這時這個Acvtivity就在任務棧的棧頂 並且把第二個Activity的例項銷燬
該啟動模式只允許一個棧中有一個Activity存在
4.singleInstance
在一個新棧中建立該Activity例項,並讓多個應用共享改棧中的該Activity例項。一旦改模式的Activity的例項存在於某個棧中,任何應用再啟用改Activity時都會重用該棧中的例項,其效果相當於多個應用程式共享一個應用,不管誰啟用該Activity都會進入同一個應用中
圖解
這裡寫圖片描述
例項
修改程式碼如下

android:launchMode="singleInstance" 

執行介面
這裡寫圖片描述
點選後會調轉到
這裡寫圖片描述
這是這個Activity是在第一個app任務棧的棧頂 所以需要點選兩次才能退出程式
此啟動模式和我們使用的瀏覽器工作原理類似,我們都知道在多個程式中訪問瀏覽器時,如果當前瀏覽器沒有開啟,則開啟瀏覽器,否則會在當前開啟的瀏覽器中訪問此模式會節省大量的系統資源,因為他能保證要請求的Activity物件在當前的棧中只存在一個。

這就是Activity的四種啟動模式 我們在開發Android專案時會經常使用到,巧妙設定Activity的啟動模式會節省系統開銷和程式執行效率。有不對的地方還請指教。