欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 啟動(dòng)模式詳細(xì)介紹

 更新時(shí)間:2016年12月02日 14:33:30   作者:崢嶸life  
這篇文章主要介紹了Android 啟動(dòng)模式詳細(xì)介紹的相關(guān)資料,Activity一共有以下四種launchMode啟動(dòng)模式,這里一一做詳解,需要的朋友可以參考下

Android 啟動(dòng)模式:

    啟動(dòng)模式:LaunchMode在多個(gè)Activity跳轉(zhuǎn)的過程中扮演著重要的角色,它可以決定是否生成新的Activity實(shí)例,是否重用已存在的Activity實(shí)例,是否和其他Activity實(shí)例公用一個(gè)task里。 

     這里簡(jiǎn)單介紹一下任務(wù)棧task的概念,task是一個(gè)具有棧結(jié)構(gòu)的對(duì)象,一個(gè)task可以管理多個(gè)Activity,啟動(dòng)一個(gè)應(yīng)用,也就創(chuàng)建一個(gè)與之對(duì)應(yīng)的task。任務(wù)棧里面的Activity是按照先進(jìn)后出的形式保存的,比如:你打開一個(gè)頁(yè)面,在頁(yè)面中打開另一個(gè)頁(yè)面,另一個(gè)頁(yè)面退出后,返回的是第一個(gè)打開的頁(yè)面,這就是任務(wù)棧的簡(jiǎn)單原來。 

     但是在實(shí)際程序中多次頁(yè)面跳轉(zhuǎn)后,不想再回到上次打開的頁(yè)面,這時(shí)候頁(yè)面顯示的啟動(dòng)模式就很有必要了。

Activity一共有以下四種launchMode啟動(dòng)模式:

1.standard
2.singleTop
3.singleTask
4.singleInstance

我們可以在AndroidManifest.xml配置的android:launchMode屬性為以上四種之一即可。如圖所示:
launchMode 

下面分別介紹這四種啟動(dòng)模式。 

     這里要先理解棧頂?shù)母拍睿褐灰琼?yè)面剛打開,不管他是什么模式的,它都是棧頂頁(yè)面。
     棧底的概念雖然書上沒說,但是要理解透徹棧的模式,還是要知道有這個(gè)說法,比如:首先打開的頁(yè)面是位于最底下的,然后后面打開的頁(yè)面一次往上堆。只有最底下的頁(yè)面關(guān)閉,程序才算完成關(guān)閉。

一.四種啟動(dòng)模式的概念和理解

(一)standard標(biāo)準(zhǔn)模式

     是默認(rèn)的啟動(dòng)模式,不用為配置android:launchMode屬性即可,當(dāng)然也可以指定值為standard。
     每次啟動(dòng)standard模式的Activity時(shí),都創(chuàng)建Activity實(shí)例,并放入任務(wù)棧;
     簡(jiǎn)單的理解:如果幾個(gè)頁(yè)面都是standard模式啟動(dòng)的,那么頁(yè)面無論是跳轉(zhuǎn)到別的頁(yè)面還是自己跳轉(zhuǎn)到自己頁(yè)面,跳轉(zhuǎn)多少次后,就要點(diǎn)擊多少次退出鍵最后才能關(guān)閉所有的。

(二)SingleTop棧頂單例模式

     指定屬性android:launchMode=”singleTop”,系統(tǒng)就會(huì)按照singleTop啟動(dòng)模式處理跳轉(zhuǎn)行為。這個(gè)在實(shí)際中并不常用。
     如果某個(gè)Activity自己激活自己,即任務(wù)棧棧頂就是該Activity,則不需要?jiǎng)?chuàng)建,只需復(fù)用自己已有的Activity示例即可。但是如果自己不是棧頂?shù)脑?,還是會(huì)創(chuàng)建自己的示例的。
     簡(jiǎn)單的理解:如果頁(yè)面的啟動(dòng)類型是SingleTop類型的,它點(diǎn)擊跳轉(zhuǎn)到自己的頁(yè)面,只需要點(diǎn)擊一次退出就退出程序了。因?yàn)楫?dāng)它處于棧頂時(shí),它無論點(diǎn)擊多少次跳轉(zhuǎn)到自己,都自有一個(gè)Activity實(shí)例,點(diǎn)擊一次退出就會(huì)退出程序。和Standard模式對(duì)比的話,Standard模式下點(diǎn)擊多少次自己就要退出多少次后才能退出程序。

(三)SingleTask內(nèi)單例模式

     指定屬性android:launchMode=”singleleTask”,這是應(yīng)用中比較常用到的模式。也是我們要重點(diǎn)理解的模式。
     如果要啟動(dòng)的那個(gè)SingleTask模式的Activity在任務(wù)棧中存在該實(shí)例,則不需要?jiǎng)?chuàng)建,只需要把此Activity放入棧頂,并把該Activity以上的Activity實(shí)例都移出棧里面;如果不存在該模式的Activity就創(chuàng)建給模式的Activity放在該棧頂。也就是說:一個(gè)棧里面只能有一個(gè)SingleTask模式的Activity。
     上面幾句重點(diǎn)理解一下:
     如果SingleTask模式的Activity已經(jīng)存在棧頂,那么再次跳轉(zhuǎn)到自己頁(yè)面,它是不會(huì)創(chuàng)建自己的Activity實(shí)例對(duì)象的,這個(gè)和SingleTop是一樣的。
     但是如果SingleTask模式的Activity已經(jīng)不在棧頂,那么再次跳轉(zhuǎn)到自己頁(yè)面,它是不會(huì)創(chuàng)建自己的Activity實(shí)例對(duì)象的,也會(huì)直接跳轉(zhuǎn)到自己的實(shí)例Activity,并且把壓在該模式之上的所有Activity實(shí)例都移除棧,但是該模式底下的Activity實(shí)例它是沒有辦法移除的。
     如果SingleTask模式的Activity都還沒有創(chuàng)建,那么它會(huì)新建它的Activity實(shí)例對(duì)象,并把自己放在棧頂,這個(gè)和所有的Activity實(shí)例對(duì)象都是一樣的。
     關(guān)于SingleTask的應(yīng)用是特別值得注意的,比如主頁(yè)面的設(shè)計(jì)一般使用SingleTask模式來設(shè)計(jì),因?yàn)橛脩酎c(diǎn)擊多次頁(yè)面的相互跳轉(zhuǎn)后,在點(diǎn)擊回到主頁(yè),再次點(diǎn)擊退出,這時(shí)他的實(shí)際需求就是要退出程序,而不是一次一次關(guān)閉剛才跳轉(zhuǎn)過的頁(yè)面,最后才退出。這就需要用到SingleTask模式。

(四)SingleInstance全局單例模式

     指定屬性android:launchMode=”singleleInstance”。
該模式下,無論是從哪一個(gè)任務(wù)棧Task中啟動(dòng)Activity,只會(huì)創(chuàng)建一個(gè)目標(biāo)的Activity實(shí)例,并且使用一個(gè)全新的Task棧來加載該Activity實(shí)例。
     可以看出SingleInstance模式比SingleTask模式更加霸道,打開一個(gè)SingleTask模式的Activity,它如果已經(jīng)存在它會(huì)把在它之上的該Task里面的Activity實(shí)例移除;而打開SingleInstance模式的Activity,不管它存不存在,他都會(huì)新建一個(gè)Task,把自己放在里面,也就就是說剛打開的SingleInstance的Activity在自己新建的棧里面只有自己一個(gè)實(shí)例對(duì)象。
     但是它和新建自己的Task時(shí),是不會(huì)移除自己之前Activity實(shí)例上面或下面的Activity實(shí)例,之前的Task里面的Activity依然存在。
如果應(yīng)用1的任務(wù)棧中創(chuàng)建了MainActivity實(shí)例,如果應(yīng)用2也要激活MainActivity,則不需要?jiǎng)?chuàng)建,兩應(yīng)用共享該Activity實(shí)例;
     SingleInstance模式一般是用于資源的共享。比如有軟件A打開的QQ和用軟件B打開的QQ是打開的是同一個(gè)QQ軟件。并且退出QQ程序后,原來打開的程序并沒有被關(guān)閉。
     這就是SingleInstance模式作用。

二.編程程序加強(qiáng)理解

     本程序只是簡(jiǎn)單頁(yè)面的跳轉(zhuǎn),用來驗(yàn)證上面的模式的正確性和加強(qiáng)對(duì)模式過程的理解。

本程序設(shè)計(jì)一份之后簡(jiǎn)單復(fù)制就可以完成。

設(shè)計(jì)后的結(jié)果:四個(gè)Activity和四個(gè)布局文件,如圖所示:
文件創(chuàng)建

(一)布局文件activity.xml的設(shè)計(jì)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:orientation="vertical">

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="standard模式" />

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="ToMainActivity"
    android:text="去主頁(yè)面"
    android:textAllCaps="false"
    />

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="ToSingleTopActivity"
    android:text="SingleTop模式頁(yè)面"
    android:textAllCaps="false"/>

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="ToSingleTaskActivity"
    android:text="ToSingleTask模式頁(yè)面"
    android:textAllCaps="false"/>

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="ToSingleInstanceActivity"
    android:text="ToSingleInstance模式頁(yè)面"
    android:textAllCaps="false"
    />

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="ToFinish"
    android:text="關(guān)閉頁(yè)面"
    android:textAllCaps="false"/>
</LinearLayout>

其中上面的TextView控件的內(nèi)容要改為該頁(yè)面設(shè)計(jì)的模式名。

(二)MainActivity.java文件代碼的設(shè)計(jì)

package com.example.android;
import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.View;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  //跳轉(zhuǎn)到MainActivity頁(yè)面
  public void ToMainActivity(View v) {
    startActivity(new Intent(this, MainActivity.class));
  }

  //跳轉(zhuǎn)到SingleTopActivity頁(yè)面
  public void ToSingleTopActivity(View v) {
    startActivity(new Intent(this, SingleTopActivity.class));
  }

  //跳轉(zhuǎn)到SingleTaskActivity頁(yè)面
  public void ToSingleTaskActivity(View v) {
    startActivity(new Intent(this, SingleTaskActivity.class));
  }

  //跳轉(zhuǎn)到SingleInstanceActivity頁(yè)面
  public void ToSingleInstanceActivity(View v) {
    startActivity(new Intent(this, SingleInstanceActivity.class));
  }

  //關(guān)閉頁(yè)面頁(yè)面
  public void ToFinish(View v) {
    finish();
  }


  }

四個(gè)Activity文件的文件名換一下就可以了。

(三)程序運(yùn)行前要設(shè)置AndroidManifest.xml,如下:

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

    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>
<activity
  android:name=".SingleTopActivity"
  android:launchMode="singleTop" />
<activity
  android:name=".SingleTaskActivity"
  android:launchMode="singleTask"/>
<activity
  android:name=".SingleInstanceActivity"
  android:launchMode="singleInstance" />

前面一個(gè)activity是系統(tǒng)默認(rèn)添加的,后面三個(gè)activity是要自己手動(dòng)添加的

(四)程序運(yùn)行后的結(jié)果:

cuxu
程序啟動(dòng)后點(diǎn)擊各個(gè)模式試一下,最后每次點(diǎn)擊關(guān)閉頁(yè)面,看看退出的順序是否是你所想的?要弄清過程就可以。 

     一些簡(jiǎn)單的邏輯順序,比如: 

     1.比如多次點(diǎn)擊主頁(yè)面按鈕,要多次點(diǎn)擊關(guān)閉頁(yè)面按鈕才能退出程序。
     2.點(diǎn)擊ToSingleTask模式的頁(yè)面后,無論你點(diǎn)擊多少次,去主頁(yè)面的按鈕或ToSingTop按鈕,再點(diǎn)擊一次ToSingleTask按鈕后,點(diǎn)擊關(guān)閉頁(yè)面按鈕后,退回的是standard模式頁(yè)面,再次點(diǎn)擊關(guān)閉頁(yè)面按鈕后將退出程序。
     3.后面也可以改變程序的最開始啟動(dòng)的頁(yè)面的啟動(dòng)模式,再看看運(yùn)行的效果。

(五)對(duì)比一下這四種模式

       Android的四種啟動(dòng)模式是Standard、SingleTop、SingleTask、SingleInstance,這是我們要必須要記住的幾個(gè)關(guān)鍵字。這幾種模式有什么區(qū)別? 我簡(jiǎn)單描述一下: 

       1.從四種模式的命名都可以看出,后面三種模式都帶有single關(guān)鍵字,是單例的意思,所以后面三個(gè)模式都是單例的模式。而前面一個(gè)模式是加載模式,即點(diǎn)擊多少次該頁(yè)面,該頁(yè)面就會(huì)加載多少個(gè)Activity對(duì)象。 

       2.后面三種單例模式再對(duì)比一下,可以發(fā)現(xiàn)它們的單例強(qiáng)度一個(gè)比一個(gè)強(qiáng):
       (1)SingleTop單例模式,只能保證它在棧頂?shù)那闆r下,它才是單例模式;比如,當(dāng)前頁(yè)面是SingleTop模式的頁(yè)面,如果點(diǎn)擊跳轉(zhuǎn)到自身頁(yè)面,在棧里面是不會(huì)創(chuàng)建再它的Activity對(duì)象的;如果singleTop模式的頁(yè)面還沒有創(chuàng)建或給模式的頁(yè)面不在棧頂,這種情況下跳轉(zhuǎn)到該模式的那個(gè)頁(yè)面,會(huì)重新創(chuàng)建它的Activity對(duì)象。 

       對(duì)比Standard模式和SingleTop模式發(fā)現(xiàn),在同一個(gè)棧里面,可以有多個(gè)standard模式的同一個(gè)頁(yè)面的對(duì)象,也可以有多個(gè)SingleTop模式的同一個(gè)頁(yè)面的對(duì)象,但是SingleTop模式的同一個(gè)頁(yè)面不可以連續(xù)兩次存在,這里注意是連續(xù)的兩次。而Standard模式的同一個(gè)頁(yè)面可以連續(xù)多次的出現(xiàn),這是它們的區(qū)別。 

       (2)SingleTask單例模式,能保證它在整個(gè)棧里面只有它一個(gè)Activity對(duì)象,如果同一個(gè)SingleTask模式的頁(yè)面之前打開過,然后點(diǎn)擊其他頁(yè)面之后,再次點(diǎn)擊上面的SingleTask模式的那個(gè)頁(yè)面,那么第一次打開這個(gè)頁(yè)面的后面的所有Activity對(duì)象都會(huì)被清除掉,但是該模式頁(yè)面打開之前打開的頁(yè)面的Activity對(duì)象沒有被清除。
       對(duì)比SingleTop和SingleTask這兩種單例模式,在整個(gè)棧的的數(shù)量是其中的一個(gè)區(qū)別,SingleTask模式的同一個(gè)頁(yè)面在一個(gè)Task里面只能有一個(gè)Activity對(duì)象。 

       (3)SingleInstance單例模式,上面的SIngleTask模式已經(jīng)很強(qiáng)了,難道還有比他更強(qiáng)的嗎。答案肯定是有的。SingleInstance單例模式能保證在整個(gè)Task中只能有它自己一個(gè)Activity對(duì)象,這里要注意是整個(gè)Task中,無論是棧頂棧底都是它自己。實(shí)現(xiàn)的方法是,它會(huì)新建一個(gè)自己的Task棧來保存自己的Activity示例,當(dāng)再次點(diǎn)擊它時(shí)它也是不會(huì)創(chuàng)建自己的示例,不管它是不是在棧頂,它在整個(gè)程序中只會(huì)保存一個(gè)實(shí)例對(duì)象。因?yàn)樗亲约簡(jiǎn)为?dú)一個(gè)Task棧保存的,所以它是不會(huì)清除它的Activity實(shí)例對(duì)象的;比如;在SingleInstance模式的頁(yè)面上打開其他模式的頁(yè)面,它的Activity對(duì)象是保存在一個(gè)原來的Task棧里面的,即打開SingleInstance頁(yè)面之前的Task棧里面;如果SingleInstance模式的頁(yè)面的最開始打開的,那么其他的模式的Activity對(duì)象也是放在一個(gè)新建的Task棧里面。 

       對(duì)比SIngleTask和SingleInstance,這兩種單例模式,SingleTask模式的Activity對(duì)象會(huì)移除在它的Activity對(duì)象之上的Activity對(duì)象,而SingleInstance模式,會(huì)在另一個(gè)Task棧里面保存自己的對(duì)象。 

       這四種模式中,只用SingleInstance模式的頁(yè)面會(huì)創(chuàng)建新的Task棧(同一個(gè)頁(yè)面只創(chuàng)建一次),其他的模式都是在原來的棧里面創(chuàng)建Activity對(duì)象

三.Android啟動(dòng)模式相關(guān)的知識(shí)

(一)退出單個(gè)Activity方法:1.調(diào)用finish2.殺死該進(jìn)程:killprocess(Process.mId)3.終止正在運(yùn)行的虛擬機(jī):system.exit()(二)退出整個(gè)應(yīng)用:1.制造拋異常導(dǎo)致整個(gè)程序退出2.將所有的activity放入到一個(gè)list中,然后在需要退出的時(shí)候,將所有的activity,finish掉3.通過廣播來完成退出功能

     通過廣播來完成退出功能,具體實(shí)現(xiàn)過程是這樣的:在每個(gè)Activity創(chuàng)建時(shí)(onCreate時(shí))給Activity注冊(cè)一個(gè)廣播接收器,當(dāng)退出時(shí)發(fā)送該廣播即可。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論