標籤:create class 不同 efault win tco 實現 font line
活動的啟動模式
啟動模式一共有四種,分別是 standard、singleTop、 singleTask 和 singleInstance,可以在 AndroidManifest.xml 中通過給<activity>標籤指定 android:launchMode屬性來選擇啟動模式。下面我們來逐個進行學習。
1.standard模式:(對於使用 standard 模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會建立 該活動的一個新的執行個體。)
是活動預設的啟動模式
修改 FirstActivity中 onCreate()方法的代碼,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//從列印資訊中我們就可以看出,每點擊一次按鈕就會建立出一個新的 FirstActivity執行個體我們需要按三次back才能退出程式。
Log.d("FirstActivity", this.toString());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//我們,在 FirstActivity的基礎上啟動 FirstActivity。
Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
startActivity(intent);
}
});
}
2.singleTop模式(在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用 它,不會再建立新的活動執行個體。)
修改 AndroidManifest.xml中 FirstActivity的啟動模式,
<activity
android:name=".FirstActivity"
//修改 AndroidManifest.xml中 FirstActivity的啟動模式,
android:launchMode="singleTop"
android:label="This is FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
然後重新運行程式,查看 LogCat會看到已經建立了一個 FirstActivity的執行個體.僅按一次 Back鍵就可以退出程式。不過當 FirstActivity並未處於棧頂位置時,這時再啟動 FirstActivity,還是會建立新的實 例的。
3.singleTask模式(當活動的啟動模式指定為 singleTask,每次啟動該活動時系統首先 會在返回棧中檢查是否存在該活動的執行個體,如果發現已經存在則直接使用該執行個體,並把在這 個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動執行個體。)
- 修改 AndroidManifest.xml中 FirstActivity的 啟動模式
<activity
android:name=".FirstActivity"
//修改 AndroidManifest.xml中 FirstActivity的 啟動模式
android:launchMode="singleTask"
android:label="This is FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- 然後在 FirstActivity中添加 onRestart()方法,並列印日誌:
@Override
protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart");
}
- 最後在 SecondActivity中添加 onDestroy()方法,並列印日誌:
@Override protected void onDestroy() {
super.onDestroy();
Log.d("SecondActivity", "onDestroy");
}
在 SecondActivity 中啟動 FirstActivity 時,會發 現返回棧中已經存在一個 FirstActivity 的執行個體,並且是在 SecondActivity 的下面,於是 SecondActivity 會從返回棧中出棧,而 FirstActivity 重新成為了棧頂活動,因此 FirstActivity 的 onRestart()方法和 SecondActivity的 onDestroy()方法會得到執行。
4.singleInstance模式(指定為 singleInstance模式的活動會啟用一 個新的返回棧來管理這個活動)
使用情境:假設我們的程式中有一個 活動是允許其他程式調用的,如果我們想實現其他程式和我們的程式可以共用這個活動的執行個體。?使用前面三種啟動模式肯定是做不到的,因為每個 應用程式都會有自 己的返回棧,同一個活動在不同的返回棧中入棧時必然是建立了新的執行個體。而使用 singleInstance模式就可以解決這個問題,在這種模式下會有一個單獨的返回棧來管理這個活 動,不管是哪個應用程式來訪問這個活動,都共用的同一個返回棧。
- 修改 AndroidManifest. xml中 SecondActivity的啟動模式:
<activity
android:name=".SecondActivity"
//修改 AndroidManifest. xml中 SecondActivity的啟動模式:
android:launchMode="singleInstance" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
- 修改 FirstActivity 中 onCreate()方法的代碼,在 onCreate()方法中列印了當前返回棧的 id.
Log.d("FirstActivity", "Task id is " + getTaskId());
- 修改 SecondActivity中 onCreate()方法 的代碼,列印了當前返回棧的 id.
Log.d("SecondActivity", "Task id is " + getTaskId());
- 最後修改 ThirdActivity中 onCreate()方法仍然是在 onCreate()方法中列印了當前返回棧的 id.
Log.d("ThirdActivity", "Task id is " + getTaskId());
列印結果:
可以看到,SecondActivity 的 Task id 不同於 FirstActivity 和 ThirdActivity,這說明 SecondActivity確實是存放在一個單獨的返回棧裡的,而且這個棧中只有 SecondActivity這一 個活動。
(Android第一行代碼)活動的啟動模式