編輯:關於Android編程
今天要講得是Activity的四種啟動模式launchMode屬性,該屬性用於配置該Activity的加載模式,該屬性支持以下4個屬性值。
standard:標准模式,也是默認模式。 singletop:Task棧頂單例模式。 singleTask:Task內單例模式。 singlestance:全局單例模式。在繼續寫下去之前我想說一下,像launchMode這種基礎的Android知識在網上已經有很多大神寫得十分詳細,為什麼我還要寫呢?我之所以寫,是因為我確確實實是個菜鳥,將課本、網上大神的總結再加上自己對知識點的認知去寫出來希望讓我對這個知識點更加了解。
回到話題,今天要弄懂的是:
為什麼要為Activity指定加載模式? 每個加載模式有什麼不同? 在什麼時候應該用哪一種模式? 怎麼樣使用加載模式?先介紹Android對Activity的管理,Android采用Task來管理多個Activity,當我們啟動一個應用是,Android就會為其創建一個Task,然後啟動這個應用的入口Activity (即 < intent-filter…/>)中配置的MAIN和LAUNCHER)。
可以把Task理解為任務棧,Task以棧的形式管理Activity:先入後出。通過調用Activity的getTaskId()的方法來獲取他所在Task的ID。
launchMode在多個Activity跳轉的過程中扮演著重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例共用一個Task。
那麼Activity的加載模式就是負責管理實例化,加載Activity的方式,並可以控制Activity與Task之間的加載關系。
首先我們可以在AndroidManifest.xml中配置Activity的 android:launchMode屬性:
接下來我們就開始認識這4種加載模式。
1.standard
每次通過這種模式啟動目標Activity時,Android總會為其目標Activity創建一個新的實例,並將其添加到當前Task棧中,所有我們發現:是在同個任務棧裡面,只是創建了不同的實例。
下面示例使用standard模式不斷啟動自身:
public class MainActivity3 extends ActionBarActivity {
private TextView tv;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity3);
tv = (TextView) findViewById(R.id.tv);//定義文本
btn = (Button) findViewById(R.id.Btn);//定義按鈕
tv.setText(String.format("TaskId:%d\n Current Activity:%s", getTaskId(), toString()));
btn.setOnClickListener(new View.OnClickListener() {//為按鈕添加監聽器,當單擊按鈕時啟動MainActivity3
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity3.this,MainActivity3.class));
}
});
}
正如以上代碼,每次單擊按鈕都會啟動自身MainActivity3,程序無需配置Activity的launchMode屬性,因為默認是采用standard模式.
顯然,當用戶單擊手機上面的”返回”鍵時,系統會“逐一”從Activity棧頂刪除Activity實例。同時也表明這種加載模式不會使用全新的Task。
2.singleTop
我們先在AndroidManifest.xml中配置Activity的 android:launchMode屬性:
這種模式與standard模式基本相同,但有一點是不同:當將要啟動的目標Activity已經位於Task棧頂時,系統不會重新創建目標Activity的實例。
使用的之前已修改啟動模式的實例:
當單擊按鈕時,並沒有什麼反應。<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwPs6qwcu4/LrDtcTBy73ic2luZ2xlVG9wxKPKvbXE1/fTw6Os1Nm0tL2o0ru49kFjdGl2aXR5o6xNYWluQWN0aXZpdHk0oaM8L3A+DQo8cD7P1tPQTWFpbkFjdGl2aXR5M6GiTWFpbkFjdGl2aXR5NMG9uPZBY3Rpdml0ecq1wP2jrLmmxNzKxzEuxvS2r9fUvLqjrDIuxvS2r8Ht0ru49kFjdGl2aXR5oaO+zbrDschBxvS2r0GjrEHG9LavQqO7Qsb0tq9Bo6xCxvS2r0KhozwvcD4NCjxibG9ja3F1b3RlPg0KCTxwPrT6wuvWu8rHtuDBy7j2sLTFpSDS1LywvODM/aOs1eLA777NsrvQtLP2wLTByzwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160429/20160429090546694.png" title="\" />
單擊上面那個按鈕就是A啟動A,在singleTop模式中是沒有反應的,當單擊下面那個按鈕時候就相當於 A啟動B,此時我們來看看反應如何:
根據上圖顯示,我們以及跳轉到了MainActivity4中,也就是我所說的B中, TaskId仍然與A中的12是一樣的,但兩個MainActivity實例是不一樣的。
此時我們再單擊第一個按鈕,也就是說由B到A,
此時我們仔細看,MainActivity3的兩次的實例都不一樣。
就想之前所說 :當將要啟動的目標Activity已經位於Task棧頂時,系統不會重新創建目標Activity的實例。而每次啟動其他的目標Activity時,功能就像standard模式。
3.singleTask
先在AndroidManifest.xml中配置Activity的 android:launchMode屬性:
這個十分好理解,采用這種加載模式的Activity在同一個Task內只有一個實例,當系統采用singleTask模式啟動目標Activity時,分為三種情況:
如果將要啟動的目標Activity 不存在,系統將會創建目標Activity的實例,並加入Task任務棧頂。 如果將要啟動的目標Activity 已經位於Task棧頂,此時與singleTop模式的行為相同。 如果要啟動的Activity 已經存在、但沒有位於Task棧頂,系統會將把位於該Activity上面所有Activity移出Task,從而使其轉入棧頂 (大爺作風)。4.singlelnstance
在AndroidManifest.xml中配置Activity的 android:launchMode屬性:
在這種加載模式下,系統保證無論從哪個Task中啟動目標Activity,只會創建一個目標Activity實例,並會使用一個全新的Task棧來加載該Activity實例。
如果將要啟動的目標Activity 不存在,系統會先創建一個全新的Task棧,再創建目標Activity實例,並將它假如新的Task棧頂。 如果將要啟動的目標Activity 已經存在,無論它位於哪個應用程序中、位於哪個Task中,系統都會把該Activity所在的Task轉到前台,從而使該Activity顯示出來。庫項目的結構一個庫項目是一個包含了源碼和資源的項目,它可以被其他的項目引用,從而讓其他項目使用它包含的代碼和資源。多個Android應用程序項目可以引用同一個庫項目,同一
本文章圍繞著Android的包管理機制,著重分析Android的包格式(包括簽名),以及應用程序的安裝,升級以及卸載過程。1. Android APK文件Android的
首先聲明一點: 這裡的多線程下載並不是指多個線程下載一個 文件,而是每個線程負責一個文件,今天給大家分享一個多線程下載的 例子。先看一下效果,點擊下載開始下載,同時顯示下
例如,屏幕的上方或下方。要實現這種效果。就需要獲得對話框的Window對象,獲得這個Window對象有多種方法。最容易的就是直接通過AlertDialog類的getWin