02探究活動-活動的啟動模式

啟動模式一共四種徊哑,分別是standard,singleTop,singleTask,singleInstance,可以在AndroidManifest.xml通過<activity>標簽指定android:launchMode屬性來選擇啟動模式

standard

這個是默認的啟動模式,在不進行指定的模式下僧界,就會用這個模式歧杏,在這個模式下砰碴,每當啟動一個新的活動九榔,他就會在返回棧中入棧兽埃,并處于棧頂?shù)奈恢媒那到y(tǒng)不會在乎這個活動是否已經(jīng)在返回棧中存在,每次啟動都會創(chuàng)建該活動的一個新的實例

  1. 修改MainActivity中的方法

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivityaaaaaaaa",this.toString());
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }

在MainActivity中啟動MainActivity柄错,當點擊兩次這個按鈕的時候它就會創(chuàng)建兩個實例舷夺,這個時候得連續(xù)按兩次Back鍵才可返回


2018-03-15_20-12-46.png

singleTop

在啟動這個模式的時候如果發(fā)現(xiàn)返回棧中的棧頂已經(jīng)是該活動的時候,則認為可以直接使用它

  1. 先修改一下AndriidManifest.xml中的代碼
  <activity android:name=".MainActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

  1. 保持主頁面代碼不變


    2018-03-15_20-22-56.png

這個時候無論點擊多少次按鈕都不會有新的打印信息出現(xiàn)售貌,因為MainActivity已經(jīng)是返回棧的棧頂了给猾,這個模式下只會有一個實例,盡按一次Back鍵就可以了

  1. 但是颂跨,此時的MainActivity不是位于棧頂?shù)奈恢玫臅r候敢伸,在啟動MainActivity的時候還是會創(chuàng)建新的實例
    先修改MainActivity中的代碼
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivityaaaaaaaa",this.toString());
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
            }
        });
    }    

這次進入的是Main2Activity中,修改Main2Activity中的代碼

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Main2Activity.this,MainActivity.class);
                startActivity(intent);
            }
        });

    }

在Main2Activity中進入MainActivity恒削,這個時候就是從第一個頁面進入第二個頁面池颈,再從第二個頁面進入第一個頁面


2018-03-15_20-33-42.png

這個時候可以看到系統(tǒng)創(chuàng)建了兩個不同MainActivity實例尾序,這個是因為在第二個頁面中在啟動第一個頁面的時候,這時的棧頂活動已經(jīng)是第二個界面了躯砰,因此會創(chuàng)建一個新的第一個頁面的實例每币,此時,必須按四次返回鍵才可以退出

singleTask

這個模式就是解決上一個活動遺留的問題琢歇,如果該活動并沒有處于棧頂?shù)哪J嚼嫉。€是可能會創(chuàng)建多個實例的,當活動的啟動模式是singleTask的時候矿微,每次啟動的時候系統(tǒng)首先會在返回棧中檢查是否有這個活動痕慢,如果有的話就直接使用該實例,沒有的話就會創(chuàng)建一個新的

    <activity android:name=".MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

現(xiàn)在重新點擊程序涌矢,在主頁面中點擊按鈕進入第二個頁面掖举,再從第二個頁面中點擊按鈕進入到第一個頁面,此時只會有一個實例


2018-03-15_20-44-13.png

可以看出娜庇,無論點擊多少次塔次,就會產(chǎn)生一個實例,按一次Back鍵就會退出程序

singleinstance

指定為這個模式的活動會啟動一個新的返回棧來管理這個活動

  1. 假設(shè)我們的程序中有一個活動是允許其他程序調(diào)用的名秀,如果想實現(xiàn)其他程序和我們的程序可以共享這個活動的實例励负,這個時候該怎么實現(xiàn)呢,使用前面三種是肯定不行的匕得,因為每一個程序都會有自己的返回棧继榆,同一個活動在不同的返回棧中入棧的時候必然是創(chuàng)建了新的實例,而使用這個模式的話就可以解決這個問題汁掠,在這個模式下會有一個單獨的返回棧來管理這個活動略吨,不管是哪一個程序來訪問這個活動,都會公用同一個返回棧考阱,也就解決共享活動的實例
  2. 修改AndroidManidest翠忠,此時修改的是Main2Activity(第二個頁面)
        <activity android:name=".Main2Activity"
            android:launchMode="singleInstance">
        </activity>
  1. 修改MainActivity中的代碼
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //打印的是返回棧中的id
        Log.d("MainActivitybbbbbb","Task id id"+getTaskId());

        setContentView(R.layout.activity_main);
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
            }
        });
    }

  1. 修改Main2Activity
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 同樣打印了當前返回棧中的id
        Log.d("MainActivitybbbbbb","Task id id"+getTaskId());
        setContentView(R.layout.activity_main2);

        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Main2Activity.this,Main3Activity.class);
                startActivity(intent);
            }
        });

    }

  1. 修改Main3Activity
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //獲取當前返回棧的id
        Log.d("MainActivitybbbbbb","Task id id"+getTaskId());

        setContentView(R.layout.activity_main3);
    }

運行程序,重第一個頁面進入第二個頁面乞榨,再從第二個頁面進入第三個頁面


2018-03-15_21-09-59.png

可以看到第二個頁面的id不同于其他的頁面秽之,這說明第二個頁面存放在一個單獨的返回棧中,而這個棧中只有這一個活動

  1. 此時按下Back鍵返回吃既,從第三個頁面就直接返回到了第一個頁面考榨,再按Back鍵,會跳到第二個頁面鹦倚,這是為什么呢董虱?
    因為此時的第一個頁面和第三個頁面是在一個返回棧中,在第三個頁面中按下Back,第三個頁面出棧愤诱,第一個頁面就位于棧頂了云头,再按下Back,當前的返回棧已經(jīng)空了淫半,于是就顯示了另一個返回棧溃槐,就是第二個頁面,再按下Back科吭,這時所有的返回棧就空了昏滴,也就退出了程序
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市对人,隨后出現(xiàn)的幾起案子谣殊,更是在濱河造成了極大的恐慌,老刑警劉巖牺弄,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姻几,死亡現(xiàn)場離奇詭異,居然都是意外死亡势告,警方通過查閱死者的電腦和手機蛇捌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咱台,“玉大人络拌,你說我怎么就攤上這事』啬纾” “怎么了春贸?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遗遵。 經(jīng)常有香客問我萍恕,道長,這世上最難降的妖魔是什么瓮恭? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任雄坪,我火速辦了婚禮厘熟,結(jié)果婚禮上屯蹦,老公的妹妹穿的比我還像新娘。我一直安慰自己绳姨,他們只是感情好登澜,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飘庄,像睡著了一般脑蠕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天谴仙,我揣著相機與錄音迂求,去河邊找鬼。 笑死晃跺,一個胖子當著我的面吹牛揩局,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掀虎,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼凌盯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烹玉?” 一聲冷哼從身側(cè)響起驰怎,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎二打,沒想到半個月后县忌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡址儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年芹枷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莲趣。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸳慈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喧伞,到底是詐尸還是另有隱情走芋,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布潘鲫,位于F島的核電站翁逞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溉仑。R本人自食惡果不足惜挖函,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浊竟。 院中可真熱鬧怨喘,春花似錦、人聲如沸振定。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽后频。三九已至梳庆,卻和暖如春暖途,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膏执。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工驻售, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人更米。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓芋浮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壳快。 傳聞我的和親對象是個殘疾皇子纸巷,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,773評論 25 707
  • 1.活動(Activity) Activity是一種可以包含用戶界面的組件,主要用于和用戶進行交互眶痰。手動創(chuàng)建活動瘤旨,...
    努力生活的西魚閱讀 716評論 0 0
  • 1. 什么是Activity Activity負責UI元素的加載與頁面之前的跳轉(zhuǎn),代表了一個頁面單元竖伯。 2. Ac...
    付凱強閱讀 509評論 0 0
  • 記得上一次沉浸在看小說中是四年前存哲,足足看了半年的小說。 那一年我一個人出差七婴,白天在用戶那里上班祟偷,晚上一個人住酒店,...
    海星_love閱讀 365評論 0 1
  • 喜歡的人有女朋友了什么感覺? 就和吃了翔一樣不爽 就和珍藏的書被墊了桌角 就和醍醐灌頂一樣覺得自己是個傻逼 就是無...
    Krazy_8閱讀 143評論 0 0