1. 程式人生 > >Android 啟動模式

Android 啟動模式

1Task與BackStack的概念

在Android中通過任務(Task)來管理活動,Task就是一些列活動的集合。每個應用程式執行都會對應建立一個Task,android通過BackStack來管理Task。
Task的活動按啟動的先後順序,依次儲存到BackStack中,每個Task都有自己對應的id號(非R檔案中),可以通過getTaskId()方法獲得。
每當新建一個活動時,該活動就會在BackStack中入棧,並且處於棧頂位置。當按下back建或者finish活動時,這個活動就會出棧,這時下一個活動就會處於棧頂位置。

2在AndroidManifes檔案中配置Activity的啟動模式

Activity的啟動模式對我們來說是一個新的概念,在實際開發過程中會給一些Activity設定恰當的啟動模式來實現特定的需求。
啟動模式一共分為四種,分別為:standard、singleTop、singleTask和singleInstance,可在AndroidManifest.xml中通過給標籤指定android:launchMode屬性來選擇啟動模式。

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="standard">

3 standard啟動模式
Standard叫做標準啟動模式,是活動啟動的預設模式,即使不在指定該模式的情況下,活動都還是會以該模式啟動。在standard模式下的活動,不管活動是否存在每次啟動都會新建這個活動。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag"
, "MainActivityonCreate"+getTaskId()); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, MainActivity.class)); } }); } @Override protected void onDestroy() { super.onDestroy(); Log.d("Tag", "MainActivityonDestroy"); } }

4singleTop啟動模式
SingleTop:共享棧頂模式,
在啟動這一類活動時,系統會先檢測當前 Task,看該 Task 的棧頂是不是
該活動的例項,如果是的話,就不需要再建立該活動例項
但是這個啟動模式只針對棧頂元素。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Tag", "onCreate"+getTaskId());
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

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

AndroidManifest.xml

<activity
            android:name="com.example.android_818_singletop.MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

5 singleTask啟動模式
SingleTask 又叫共享棧,每次啟動該活動時系統會首先在BackStack中檢查是否存在該活動的例項,如果發現已經存在則直接使用該例項,並把這個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動例項。SingleTask適合作為程式入口點。例如程式主介面

<activity
            android:name="com.example.android_818_singletask.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivity_onCreate"+getTaskId());
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "MainActivity_onDestroy"+getTaskId());
    }
}

secondActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivity_onCreate"+getTaskId());
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "MainActivity_onDestroy"+getTaskId());
    }
}

ThirdActivity.java

public class ThirdActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_three);
        Log.d("Tag", "ThirdActivity_onCreate"+getTaskId());
        findViewById(R.id.btn3).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ThirdActivity.this, MainActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "ThirdActivity_onDestroy"+getTaskId());
    }
}

6.singleInstance啟動模式(共享引用)
SingleInstance模式是這四種模式中最為特殊的,指定為singleInstance模式的活動啟動時,會用一個新的BackStack來管理該活動。

<activity android:name="com.example.android_818_singletask.SecondActivity"
           android:launchMode="singleInstance"></activity>
<activity android:name="com.example.android_818_singletask.ThirdActivity">
</activity>
 <activity
android:name="com.example.android_818_singletask.FourActivity"
           android:launchMode="singleInstance">
</activity>