編輯:關於Android編程
自己的理解加上網上的一些資料總結了關於activity的四種啟動模式
在實際項目中我們應該根據特定的需求 為每個活動指定恰當的啟動模式。啟動模式一共有四種,分別是 standard、singleTop、 singleTask 和 singleInstance,可 以在 AndroidManifest.xml 中通 過給標簽 指定 android:launchMode屬性來選擇啟動模式。
1,standard(這是活動的一個標准模式,在創建活動的時候默認是這個模式)
在 standard模式下,每當啟動一個新的活動,它就會在返回棧中入棧,並處於棧頂的位置。對於使用 standard模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會創建 該活動的一個新的實例。接下來通過一段代碼來了解一下。
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
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) {
Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
startActivity(intent);
} });
}
我個人認為代碼跟截圖應該挺清晰的說明了問題所在,所以我就不再說明了。
2,singleTop
使用singleTop模式。當活動的啟動模式指定為 singleTop,在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用它,不會再創建新的活動實例。
現在在AndroidManifest.xml中修改Activity的啟動模式(android:launchMode="singleTop")
然後重新運行程序,查看 LogCat
我個人認為代碼跟截圖應該挺清晰的說明了問題所在,所以我就不再說明了。
3, singleTask
當活動的啟動模式指定為 singleTask,每次啟動該活動時系統首先 會在返回棧中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,並把在這 個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。
現在在AndroidManifest.xml中修改Activity的啟動模式(android:launchMode="singleTask")
然後在 FirstActivity中添加 onRestart()方法,並打印日志:
@Override protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart");
}
最後在 SecondActivity中添加 onDestroy()方法,並打印日志:
@Override protected void onDestroy() {
super.onDestroy(); Log.d("SecondActivity", "onDestroy");
}
現在重新運行程序,在 FirstActivity 界面點擊按鈕進入到 SecondActivity,然後在 SecondActivity界面點擊按鈕,又會重新進入到 FirstActivity。
然後重新運行程序,查看 LogCat
4,singleInstance
singleInstance模式應該算是四種啟動模式中最特殊也最復雜的一個了,指定為 singleInstance模式的活動會啟用一 個新的返回棧來管理這個活動。
我也不好解釋,什麼都不說了,上代碼。
先修改 AndroidManifest. xml中 SecondActivity的啟動模式(android:launchMode="singleInstance")
FirstActivity 中 onCreate()方法的代碼:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity", "Task id is " + getTaskId());
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) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
} }); }
在 onCreate()方法中打印了當前返回棧的 id。然後修改 SecondActivity中 onCreate()方法 的代碼:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
startActivity(intent);
}});
}
同樣在 onCreate()方法中打印了當前返回棧的 id,然後又修改了按鈕點擊事件的代碼, 用於啟動 ThirdActivity。最後修改 ThirdActivity中 onCreate()方法的代碼:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("ThirdActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.third_layout);
}
仍然是在 onCreate()方法中打印了當前返回棧的 id。現在重新運行程序,在 FirstActivity 界 面 點 擊 按 鈕 進入 到 SecondActivity, 然 後 在 SecondActivity 界 面 點 擊 按 鈕 進入 到 ThirdActivity。運行程序,看LogCat中的信息。
這個模式比較麻煩,我也解釋不好,能力有限,大家看看截圖看看代碼自己理解吧。
本文自己胡亂杜撰的,如有雷同純屬巧合(那些原理示意圖是網上找的)
本人不承擔任何看不懂不理解寫錯的風險!!!
本文主要講解Android應用程序簽名相關的理論知識,包括:什麼是簽名、為什麼要給應用程序簽名、如何給應用程序簽名等。1、什麼是簽名?
寫程序的過程中,想法總會不斷地變,有時候會很糾結,到底做哪種效果好,怎麼做好呢? 就比如這個音樂播放器,我原來的想法是把列表頁面跟歌詞頁面放在同一個Activity中的兩
之前博客中,介紹過使用谷歌提供的鍵盤的一些api,可以很好地自定義鍵盤,這個有一個局限性,只能占滿屏幕,無法做到只能占一部分的需求鍵盤,如下圖我平板中的鍵盤需求:(由於公
React Native號稱能跨平台開發IOS和Android的原生應用,想來必定會成為一種趨勢。剛好計劃開發一款手機APP,又沒有相應的開發資源,決定自己摸索著試試。第