91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Activity生命周期與啟動模式的示例分析

發布時間:2021-09-15 15:35:22 來源:億速云 閱讀:118 作者:小新 欄目:移動開發

這篇文章主要介紹了Activity生命周期與啟動模式的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Activity作為Android開發中最常用的一個組件,是Android開發人員必須熟悉且掌握的重要內容。同時Activity也是在面試中經常被問到的一個方向。因此,掌握Activity的重要性也不言而喻。

棧是一種常見的數據結構,具有先進后出,后進先出的特點。從數據形式上來說,它可以用下面這一張圖來表示:

Activity生命周期與啟動模式的示例分析

在這個棧中,我們每一個新放進棧的數據,都會放在棧頭的位置,而其他的在之前如果已經放進來的數據,則會被逐漸按順序往棧底下面移動,看起來就像是前面先被進來的數據被后面新放進來的數據往棧底下面壓一樣。這種情況叫做壓棧。就好像一把手槍的彈夾,當我們把里面裝子彈的時候,后面放進去的子彈會被逐漸往底部擠壓下去。而當我們需要取出數據時,因為棧就規定了一個進出口,就是棧頭(也叫棧頂),所以我們取出數據的時候,也是要按照數據進來的順序,從棧頂開始取出,每取出一個順序,棧中的其他數據就會忘上移,直到最后一個數據從棧頂被取出而結束。這種情況叫做彈棧。而如果我們不想要其他的數據,值需要棧中倒數第二個數據的話,那也沒辦法,只能把這個數據前面的數據全部彈出棧,你才能取到這個數據。否則的話一切皆是免談。而在Android的設計中,是使用棧這種數據結構來存放Activity的,它有一個名字,叫做任務棧,也叫回退棧。關于棧的知識,到這里已經基本可以用來介紹Activity了,至于其他方面的內容,可參考其他博客或書籍。這里推薦的是:程杰的《大話數據結構》一書。

什么是Activity:

Activity生命周期經典圖解:

Activity生命周期與啟動模式的示例分析

Activity,中文“活動”。在任大神的書中,把它理解成界面。實際上我非常同意這種說法,因為Activity實際上就是我們在應用中展現出來的一個個用戶界面,它會加載指定的布局文件來顯示各種UI元素,并為這些元素設置事件處理函數,從而實現用戶與應用的交互。比如我們打開一個手機App時,展現出來的登錄界面、注冊界面、主界面等,都是一個個不同的Activity。它是用戶可以直接在App上用肉眼看得到的界面操作,以及針對用戶對App的某些特定操作而進行的事件處理(這個是用戶不可見的)。

Activity的組成:

在上面對Activity的介紹中,用以作為用戶可見的部分顯示的是一份.xml格式的布局文件,而用以布置事件處理函數的則是一個Activity對象。那么為什么我們把肉眼可見的部分也叫作Activity呢?因為我們可以直接在Activity中對布局文件進行操作,等于布局文件是Activity對象的一個外延,但多數情況下,我們使用Activity的方式依舊為Activity對象+xml布局文件。不過,關于Activity的組成,卻并沒有那么簡單。實際上,一個完整的Activity組成并沒有那么簡單,在Activity與開發人員可以設置的視圖,也就是對用戶界面進行布局的范圍之上,還包括了其他層次的封裝。如圖:

Activity生命周期與啟動模式的示例分析

我們可以看到,在Activity之下有一個PhoneWindow,這個PhoneWindow實際上是一個叫做Window的類的實現類。說起Window,相信有人試過在取消Activity自帶的標題欄的時候,調用了這么一個方法:

//取消系統自帶的標題欄
requestWindowFeature(Window.FEATURE_NO_TITLE);

而這個方法的具體模樣,是這樣的:

 public final boolean requestWindowFeature(int featureId) {
    return getWindow().requestFeature(featureId);
  }

我們發現,它實際回調了一個getWindow().requestFeature(featureId)方法,而這個getWindow()返回的實際上就是一個Window類型的對象mWindow:

public Window getWindow() {
    return mWindow;
  }

那么,當我們查看這個Window源碼的時候,發現它其實是抽象類

public abstract class Window {
  /** Flag for the "options panel" feature. This is enabled by default. */
  public static final int FEATURE_OPTIONS_PANEL = 0;
  /** Flag for the "no title" feature, turning off the title at the top
   * of the screen. */
  public static final int FEATURE_NO_TITLE = 1;
  /** Flag for the progress indicator feature */
  public static final int FEATURE_PROGRESS = 2;
  /** Flag for having an icon on the left side of the title bar */
  .....
}

我們知道,抽象類要想發揮作用,那么需要有一個子類去繼承抽象類,而PhoneWinsow這是這么一個實現類。我們所執行的去除標題欄的操作,實際上調用的也是這個PhoneWindow中的方法而已。這也從側面反映出我們前面所說的,Activity的組成不僅僅是一個Activity對象+xml布局文件那么簡單。盡管我們常見的模式就是這樣,但實際上這已經是經過封裝之后才展現出來的。

Activity的創建、激活與銷毀

創建Activity

要在代碼中創建一個Activity,需要經過一下幾個步驟:
1.新建一個類,繼承自android.app.Activity.類的命名建議為:xxxActivity樣式,比如LoginActivity
2.在AndroidManifest.xml文件中的 < application>節點下使用新的< activity>節點注冊該Activity,同時為< activity>節點配置android:name屬性.取值為Activity類的包名和類名,推薦為每一個< activity>節點配置android:label屬性。例如:

<activity
   android:name=".LoginActivity"
   android:label="@string/title_activity_login" >
 </activity>

注意:如果存在多個Activity,那么各< activity>節點不區分先后順序。如果要調整第一個進入軟件顯示界面的Activity,那么則需在該< activity>節點中配置以下信息:

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

3.如果需要在Activity中加入xml布局文件,則需要在res\layout目錄下創建并設計布局,命名建議為activity_xxx(與xxxActivity匹配),如activity_login。
4.設計完布局文件之后,在Activity類中重寫onCreate()方法,并在該方法中通過調用setContentView()方法加載布局。比如:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_registe
  }

以上為手動創建Activity的方式,當然我們也可以使用IDE幫助實現。以Eclipse為例:
1.快捷鍵:ztrl+N。彈出窗口如下:

Activity生命周期與啟動模式的示例分析

選擇Android目錄下-> Android Activity ,點擊Next,效果如下:

Activity生命周期與啟動模式的示例分析

選擇樣式,這里選擇默認樣式Black Activity。點擊next,效果如下:

Activity生命周期與啟動模式的示例分析

在這里,更改Activity Name欄目,下面Layout欄目也會發生自動變化,點擊finish。創建成功。

激活Activity

我們創建了Activity之后,除非把它設置為默認界面,否則都需要被激活才可使用。調用Activity類定義的startActivity(Intent)方法,即可激活新的Activity,其中:參數Intent對象可以直接通過Intent類的構造方法來創建
在使用Intent類的構造方法時,指定2個參數,第1個參數是Context對象
第2個參數是被激活的Activity類,例如SecondActivity.class。例子如下:

//跳轉到另一個Activity
startActivity(new Intent(this,SecondActivity.class));

如此,便實現了激活SecondActivity并跳轉至SecondActivity界面的操作

上面是激活Activity的第一種方法,而如果你需要在激活第二個Activity后對其設置,并且在該Activity執行finish之后返回數據給第一個Activity的時候,可以用startActivityForResult()方法。用法如下:

Intent mIntent =new Intent(this,SecondActivity.class);
int requestCode = 0;
startActivityForResult(mIntent,requestCode)

同時,在第一個Activity重寫數據返回的處理辦法onActivityResult();用法如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

}

注意:requestCode可以隨便設置,但必須大于或等于0

銷毀Activity

調用Activity類定義的finish()方法即可銷毀當前Activity。

Activity的生命周期分析:

典型情況下的生命周期分析

在正常情況下。Activity會經歷以下生命周期,每個生命周期都執行著一個聲明周期方法:

1.onCreate():在我們前面的手動創建Activity的例子中便已經接觸到這個方法,它是Activity生命周期執行的第一個生命周期方法,表示的是Activity正在被創建,在這個生命周期方法里我們可以執行一些初始化的工作。比如加載xml布局文件,初始化元素控件以及加載相應的數據或者設置監聽器等。

2.onStart():表示Activity正在啟動,并且逐漸從不可見到可見直到Activity展示到前臺

3.onRestart():表示Activity正在重啟。一般情況下,當當前的Activity由不可見狀態重新恢復為可見狀態的過程中,就會調用這個方法。

4.onResume():在Activity徹底展示在前臺(完全可見)的時候被調用,在執行完這個方法后,Activity會請求ActivityManagerService(下稱AMS)對它管理的視圖進行渲染,此時的Activity位于棧頂且保持運行狀態

5.onPause():該方法在Activity由可見狀態逐漸變為不可見的狀態的過程中調用。一般在系統準備去啟動或者恢復另一個Activity的時候調用。這時可做一些數據存儲、停止動畫或者釋放一些消耗的CPU資源等操作,但注意不要做耗時操作。否則會造成卡頓現象或者ActiviNotResponding異常(ANR)。

6.onStop():表示Activity處于停止,即完全不可見狀態。

7.onDestory():在Activity被徹底銷毀之前調用,表示著Activity被徹底移出了任務棧。是Activity的最后一個聲明周期方法。

關于Activity的生命周期,網上找了一張非常明了的示意圖:

Activity生命周期與啟動模式的示例分析

在這里作兩點補充關于從onPause()–>onStop()的特例:
1.如書中所言,當新的Activity采用的是透明主題是,Activity不回調onStop()方法
2.當新啟動的Activity是一個對話框式的Activity,那么onStop()方法同樣不會被回調。

關于書中提出的兩個問題,結合大神的解釋和自己的一些想法,歸納如下:

問題1:onStart和onResume、onPause和onStop從描述上差不多,對我們來說有什么區別呢?

大神的解釋:onStart和onStop是從Activity是否可見的角度進行回調的。而onResume和onPause是否位于前臺這個角度來回調的。在實際開發中沒有其他明顯區別。
我的想法:onStart和onPause對應的是一種動態的變化,前者是從不可見到逐漸可見再到完全可見(onResume)的變化。而后者則是從完全可見到逐漸不可見再到完全不可見的狀態(onStop)。相應的,onResume和onStop對應的就是一個靜態改變。一旦完全可見,立刻調用onResume,一旦不可見,立刻調用onStop。這也是為什么當新建的 Activity為透明主題時,onStop方法不會被回調。因為從前臺,也就是顯示界面的窗口來看,Activity并沒有從窗口中消除,依舊為可見狀態,只是這個Activity不能控制而已。

問題2:假設當前Activity為A,如果這時用戶打開一個新的ActivityB,那么B的onResume和A的onPause哪個先執行呢?

大神的解釋:從源碼分析角度來看,當我們要啟動一個Activity時,啟動Activity的請求會由Instrumentation來處理,然后它通過Bilder像AMS發送一個請求,而AMS內部維護著一個ActivityStack(任務棧),負責的是棧內的Activity的狀態同步,AMS通過ActivityThread去同步Activity的狀態從而完成生命周期的調用。在ActivityStack的源碼中,確定了新的Activity啟動之前,棧頂的Activity要先onPause后,在ActivityStackSupervisor中的realStartActivityLocked方法調用scheduleLauchActivity方法來完成新Activity的onCreate、onStart、onResume的調用過程。
我的想法:從生命周期的作用描述來看,當我們要啟動一個ActivityB并且在它由不可見到逐漸可見再到完全可見的過程中,無可避免的是會占用前臺顯示的空間,也就是說在這個過程中,會使得ActivityA失去完全可見的狀態,變成局部可見或者逐漸不可見的狀態,而在這時候,就已經調用了A的onPause方法,而當B的onResume方法被調用時,如果B不是透明主題或者對話框式的Activity的話,這個時候A的onStop也會開始被調用。即:先調用A的onPause,再調用B的onResume.

ps:自主想法,未經推敲,如果有發現不妥的地方,可在下方評論指出,以便及時更改。

異常情況下的生命周期分析

關于異常情況下的生命周期分析,大神主要講了兩種情況:

1.資源相關的系統配置發生改變導致Activity被殺死并重新創建

在發生因為系統配置突然發生改變,需要立即殺死當前的Activity并且重新創建,就如手機突然旋轉屏幕,需要重新加載適應屏幕變化的Activity的時候。Activity的生命周期如圖所示:

Activity生命周期與啟動模式的示例分析

在Activity被異常關閉并且需要重新恢復的時候,Activity會先被徹底銷毀,其onPause、onStop、onDestroy方法都會被調用。之后才再重新開始調用onCreate方法。但因為是異常關閉,在恢復Activity時我們也不希望看到數據丟失的情況。于是在Activity的onStop方法被調用前,會執行onSaveInstanceState方法保存Activity內的數據,在新恢復的Activity調用onRestoreInstanceState方法,并且把Activity銷毀前調用onSaveInstanceState方法所保存的Bundle對象作為參數同時傳遞給onCreate和onRestoreInstanceState方法,通過兩者的信息對比來判斷是否重建,如果確定是重建了,則取出之前保存的數據并且恢復,這個過程出現在onStart之前。
而關于數據恢復的過程,工作流程如下:
1.Activity調用onSaveInstanceState保存數據
2.Activity委托Window去幫忙保存數據,就好像自己死前把信物交給信得過的人一般
3.Window在委托它的上層頂級容器取保存數據,這個容器是一個ViewGroup,在Activity中可能就是DecorView
4.頂層容器通知它的子元素來保存相關數據。
5.完成

注:當Activity正常銷毀時,系統不會調用onSaveInstanceState方法來保存數據,只有在Activity異常終止的并且有機會重新顯示的情況下才會調用onSaveInstanceState方法。

2.資源內存不足導致低優先級的Activity被殺死

這種情況下,數據存儲和恢復過程和情況1是一樣的。但是這里做個區分,在手機內存不足的時候,有時候我們把應用退出到后臺,過了一會再打開的時候,發現它是重新啟動了應用,而不是像情況2說的會恢復。因為在這里涉及到的并不是情況2,事實上,情況2針對的是Activity,是指應用在執行過程中處于后臺的Activity被kill(殺死)。而上面所說的則是手機在整個應用處于后臺的時候,直接把整個應用銷毀掉,這屬于典型的生命周期調度過程(參見示意圖左側)。

下面記錄Activity的優先級情況,也就是當內存不足時,系統會根據Activity的優先級從低到高kill掉一些不需要的Activity以釋放資源工其他Activity調用。
1.前臺Activity,正在和用戶的交互的Activity,一般為用戶對可控UI元素具有操作的能力。比如,點擊按鈕有反應。優先級最高。
2.可見但非前臺Actiyity,比如Activity彈出了一個對話框,導致Activity可以可見,但是對控件不具有操作的能力,只能在對話框中進行交互,優先級次之
3.后臺Activity,位于后臺的不可見Activity,優先級最低,系統首先清理該部分的Activity。

對于情況1的一個拓展:如果想讓系統配置發生改變后不重新創建,我們可以通過在 < activity>節點中設置 以下的屬性來實現:

android:configChanges="orientation"

在這里,android:configChanges的作用是捕獲設備的變化,并回調相應的處理方法而不會重新恢復Activity。當然,關于ConfigChanges的屬性值是有很多的,但我們需要定義多個屬性的時候,可以用 | 號分割,比如:

android:configChanges="orientation|keyboardHidden"

而關于configChages的屬性值及其含義,可以參考如下:

Activity生命周期與啟動模式的示例分析

Activity的啟動模式:

關于Activity的啟動模式,就要回顧我們的預備知識——任務棧了。在Android中,系統是利用任務棧來存儲每次創建的Activity,這就意味著只要有多次重復調用同一個Activity的現象,那么我們就要創建多個Activity并且把他們存儲到Activity中,這樣不僅浪費存儲空間,還使得Activity的回退機制變得過于死板,不符合Android靈活開發的需求。于是,Android對任務棧就行了一定的功能封裝,形成了四種啟動模式:

1.standard(標準模式):這是系統默認的啟動模式,每創建一個新的Activity,都會產生一個新的Activity實例并且放入相應的任務棧中。和典型的棧調用數據類似沒多大區別。

2.singleTop(棧頂復用模式,也叫棧頂唯一模式):在這種模式下,如果要新建的Activity本身已經有一個Activity實例位于棧頂時,那么這個Activity不會被重新創建,而是會回調onNewIntent方法取出當前請求的信息,而這個新建的Activity不會被系統調用onCreate、onStart方法。注意的是,該模式只使用于新Activity已經位于棧頂。否則的話還是會創建新的Activity并且進行壓棧操作。

3.singTask(棧內復用模式,也叫任務唯一模式):在這個模式下,只要Activity在任務棧中存在,那么當我們新建該Activity時,會將棧內存在的Activity做置頂操作。也就是說,除非要創建的Activity已經位于棧頂,否則系統會在棧內將位于該Activity之上的所有Activity做彈棧操作,直到該Activity位于棧頂。而如果要創建的Activity在棧內不存在時,會直接創建并壓棧。

4.singleInstance(單實例模式):這是一種加強的singleTask模式,它除了具有singTask的一切特性之外,還加強了一點,就是具有此模式的Activity只能單獨的位于一個任務棧中。也就是說,如果ActivityA是singleInstance模式,在它啟動的時候,系統會為它分配一個新的任務棧。由于singleTask的復用性,在其他需要創建Activity的時候,都不會創建新的Activity。而注意的是,因為singleInsyance模式所創建的實例是位于一個獨立的任務棧里,所以當我們銷毀Activity的時候,會先把棧頂Activity所在的任務棧里面的Activity清理完畢再來清理該Activity。例如,Activity的啟動順序如下:
A(棧頂)
B(singleInstance)
C
D(棧底)
那么當我們連續按back鍵時,銷毀順序為 A -> C -> D -> B

askAffinity與Activity的關系

在講述兩者關系的時候,首先可以聲明一下:在Android系統中,并不是只有一個任務棧,很多時候,在每一個應有程序之間都會存有一個任務棧,在這個應用中所創建出來的Activity,在一般情況下會放入同應用下的任務棧中,而這個任務棧的名字為應用的包名。那么,有沒有特殊情況,我們創建的Activity會進入到其他的任務棧之中呢?如果可以,它又會跳轉到哪個任務棧中呢?我們可以通過TaskAffinity屬性給出答案。
每一個Activity都會有一個TaskAffinity參數,這個參數標識了Activity所需要進入的任務棧的名字。如果我們不對其進行設置,那么它默認為當前應用的包名,也就是當前應用下的任務棧。而如果我們對其設置了其他應用的包名的話,那么在一些特定情況下,該Activity則會出現轉移的情況,書中介紹了兩種情況:

1.當TaskAffinity和singleTask啟動模式配對使用的時候

如果應用要加載singleTask模式的Activity時,首先該Activity會檢查是否存在與它的taskAffinity相同的任務棧。如果存在,那么檢查棧內是否有已經實例化的Activity,如果有,那么銷毀在該Activity以上的Activity并調用onNewIntent。如果沒有,那么該Activity實例化并入棧。而如果任務棧不存在,那么將重新創建出一個任務棧,并入棧。

2.當TaskAffinity與allowTaskReparenting結合的時候

在這種情況下,如果該Activity的allowTaskReparenting設置為true的時候,這個Activity會直接進入后臺,直到當和TaskAffinity名字相同的任務棧進入前臺的時候,此時的Activity會轉移到該任務棧中并處于棧頂位置。
書中例子:先有應用A、B。當在A中啟動B的一個ActivityC,然后按Home鍵回到桌面,打開B應用。此時你會發現顯示出來的是ActivityC。

給Activity制定啟動模式的方法

1.通過AndroidMenifest.xml為Activity指定啟動模式,在相應的節點中添加屬性:

android:launchMode="launchName"

這里的launchName為四種啟動模式任意一種,注意為英文!

2.在Intent中設置標志位來指定啟動模式。比如:

Intent intent =new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

注:當兩種方法同時應用時,以第二種方法為準。

Activity中Intent與IntentFilter的匹配規則:

在前面介紹Activity的激活方法時,我們已經介紹了如何去用Intent去啟動一個Activity,但我們所講的啟動Activity是有兩種辦法,前面說的是顯式啟動,意即是可以清楚知道Activity下一個跳轉的Activity是什么。(從Intent的參數對象就可以看出)。而關于啟動Activity的另一種辦法–隱式啟動,則更多的是一舉通過Intent與IntentFilter的匹配來實現的。下面就介紹一下Activity中Intent與IntentFilter的匹配規則。

1.IntentFilter如何設定

在AndroidManifest.xml文件中,找到< application>,在指定的< activity>標簽內添加,如例:

 <activity
     android:name=".RegisterActivity"
     android:label="@string/app_name" >
     <intent-filter>
     <action android:name="android.intent.action.MAIN" />

     <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

 </activity>

2.Intent與IntentFilter的聯合工作

Intent與IntentFilter的聯合工作表現為:開發者在需要啟動一個Activity時,通過Intent向傳遞每個Activity的IntentFilter發送一則消息,如果有某個Activity的預定義信息和接收到的Activity相匹配,則表示下一個要啟動的Activity為該Activity。因為我們在開發者中并不能直接透過代碼看到下一個Activity是什么,只是透過這種信息匹配的方法去完成的Activity啟動過程,就是隱式啟動。

3.IntentFilter的過濾信息:

IntentFilter的過濾信息主要包括三種:action、category、data,三種過濾信息都有相應的功能。如果一個Intent傳遞的信息同時匹配了IntentFilter設定的過濾信息,那么才能成功啟動目標Activity,否則就算失敗。不過注意的是,一個Activity可以設定多個IntentFilter,只要有其中一組IntentFilter完全匹配,同樣可以開啟該Activity。
下面分別介紹三種過濾信息的作用:

action的匹配規則

action的本質是一個字符串,其作用是描述Intent所觸發的動作的名稱,我們知道,一個人可以有多種稱呼,當其他人要找這個人時,只需要叫他其中一個名字就可以了。同樣,在IntentFilter中,我們可以定義多個action,只要有一個action和Intent傳遞的信息匹配,那么就算配合成功。注意的是,系統本身預定義了一些action,代表可啟動的一些預定義的Activity,比如撥號界面等這些預定義的action集中放在android.intent.action下,調用的時候從里面選取,比如:

android.intent.action.SEND

action在IntentFilter中的定義格式如下:

//actionName表示你需要加入的action信息
<action android:name="actionName"/>

action在Intent中的調用格式如下:

String action="actionName";
Intent intent =new Intent(action);

category匹配規則

category和action的本質是一致的,但代表的意義不同,category描述的是目標組件的類別信息,表明這個目標可以干些什么,比如系統預定義中的:

CATEGORY_GADGET:表示目標Activity是可以嵌入到其他Activity中的

當然,我們也可以給它進行自定義的設置。
而關于category的匹配規則,大致如下:如果Intent中含有category,那么不管你有幾個,都需要和目標Activity在IntentFilter中設定的category匹配。哪怕有一個是不匹配的,都將報下面這個異常:

android.content.ActivityNotFoundException:No Activity found to handle Intent {act=actionName cat=[categoryName]}

category在IntentFilter中的定義格式如下:

<category android:name="android.intent.category.LAUNCHER" />

category在Intent中的添加category調用格式如下:

String category ="categoryName";
intent.addCategory(category);

data匹配規則

data的匹配規則和action相似,如果IntentFilter中定義了data,那么Intent中必須也要定義可匹配的data,但是因為data的結構與action不一樣,所以會有一些變化的地方。

data的組成

data由兩部分組成:mimeType 和URI。其中,mimeType指的媒體類型,可以表示圖片image/jpeg,文本text/html ,音頻audio/mpeg4-generic 和視頻video/*等。而URI表示統一資源標識符(Uniform Resource Identifier),用以制定所需資源的存儲路徑。其結構如下:

<scheme>://<host>:<port>:/[<path>|<pathPrefix>|<pathfrefix>]

結構說明如下:
scheme:URI的模式,比如http、file等
host:URI的主機名,即當前資源所在的主機的IP地址,可以用域名表示,如www.baidu.com
port:URI的端口號,比如80,指獲得資源的窗口路徑。
path、pathPrefix、pathPattern:表示路徑信息

data在IntentFilter的定義格式:

<data 
   android:mimeType="mimeName"
   android:scheme="schemeName"
   android:host="hostName"
   android:port="portName"
   android:path="pathName"
   android:pathPrefix="pathPrefixName"
   android:pathPattern="pathPatternName"
/>

或者:

<data android:mimeType="mimeName"/>
<data android:scheme="schemeName"/>
......
<data android:pathPattern="pathPatternName"/>

data在Intent中的調用方法有:

intent.setdata(Uri data);
intent.setDataAndNormalize(Uri data);
intent.setDataAndType(Uri data, String type);
intent.setDataAndType(Uri data, String type);
intent.setDataAndTypeAndNormalize(Uri data, String type);

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Activity生命周期與啟動模式的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝兴县| 平南县| 仙居县| 永德县| 武穴市| 穆棱市| 遂平县| 鸡泽县| 饶平县| 武安市| 土默特左旗| 五原县| 抚顺市| 高淳县| 阜宁县| 延寿县| 卓资县| 科尔| 永清县| 公主岭市| 安溪县| 庄河市| 新平| 泸水县| 岳阳市| 淅川县| 乐安县| 元氏县| 武山县| 都匀市| 鹿邑县| 聂荣县| 莲花县| 谢通门县| 葫芦岛市| 阿坝县| 泾源县| 平山县| 内黄县| 炉霍县| 应城市|