輯上解耦合的方式實(shí)現(xiàn),但是操作系統(tǒng)可以(但不是必須)使用有關(guān)前臺(tái)組件的執(zhí)行的信息來管理后臺(tái)組件的執(zhí)行,或者反之亦然。例如,在一些實(shí)施例中,僅當(dāng)前臺(tái)組件掛起或者非運(yùn)行時(shí),操作系統(tǒng)可以調(diào)度后臺(tái)組件用于執(zhí)行??傊?,邏輯上解耦合前臺(tái)組件和后臺(tái)組件可以賦予操作系統(tǒng)選項(xiàng),以創(chuàng)建組件的執(zhí)行之間的依賴關(guān)系或者不創(chuàng)建這種依賴關(guān)系。
[0067]現(xiàn)在轉(zhuǎn)向圖2所示的說明性生命周期200,操作系統(tǒng)可以運(yùn)用任何適當(dāng)?shù)囊?guī)則集合來確定何時(shí)將前臺(tái)組件從一個(gè)狀態(tài)移動(dòng)到另一狀態(tài)。這樣的規(guī)則可以被設(shè)計(jì)為防止沒有正在受用戶關(guān)注的前臺(tái)組件消耗諸如電池功率、處理器周期和存儲(chǔ)器之類的資源。實(shí)施這些規(guī)則可以提高電池壽命和/或正在受用戶關(guān)注的前臺(tái)組件的響應(yīng)度。在一個(gè)示例中,操作系統(tǒng)可以將沒有正在受用戶關(guān)注的前臺(tái)組件從掛起狀態(tài)移動(dòng)到非允許狀態(tài),以回收存儲(chǔ)器資源。
[0068]在一些實(shí)施例中,前臺(tái)組件可以初始地處于非運(yùn)行狀態(tài),并且操作系統(tǒng)可以響應(yīng)于用戶動(dòng)作(例如,用戶在對(duì)應(yīng)于應(yīng)用的圖標(biāo)或者圖塊上點(diǎn)擊)啟動(dòng)前臺(tái)組件。啟動(dòng)前臺(tái)組件可以涉及:將前臺(tái)組件和前臺(tái)組件可以訪問的任何輔助組件加載到存儲(chǔ)器中,初始化前臺(tái)組件,和/或分配合適的資源。如果應(yīng)用的后臺(tái)組件已經(jīng)在啟動(dòng)前臺(tái)組件時(shí)運(yùn)行并且前臺(tái)組件被加載到與后臺(tái)組件相同的進(jìn)程中,則一些輔助組件也許已被加載并且一些資源也許已被分配。否則,可以執(zhí)行整個(gè)發(fā)起。在任一個(gè)事件中,前臺(tái)組件都可以在激活狀態(tài)205中啟動(dòng),并且可以由操作系統(tǒng)調(diào)度用于執(zhí)行。
[0069]在一些實(shí)施例中,一旦前臺(tái)組件從存儲(chǔ)裝置中被加載,操作系統(tǒng)就可以通過調(diào)用前臺(tái)組件提供的API函數(shù)執(zhí)行前臺(tái)組件的進(jìn)入點(diǎn)函數(shù)來初始化前臺(tái)組件。更具體而言,在圖1至圖2所示的示例中,操作系統(tǒng)可以調(diào)用由前臺(tái)組件實(shí)現(xiàn)的所謂的“啟動(dòng)”方法。
[0070]當(dāng)用戶正在主動(dòng)與前臺(tái)組件交互時(shí),操作系統(tǒng)可以將前臺(tái)組件維持在激活狀態(tài)205中,以避免干擾用戶的體驗(yàn)。用戶可以按照多種不同的方式(例如通過經(jīng)由用戶接口向前臺(tái)組件提供輸入)主動(dòng)地與前臺(tái)組件交互。出于確定前臺(tái)組件是否要保持在激活狀態(tài)的目的,如果前臺(tái)組件正在呈現(xiàn)輸出(例如,播放音頻和/或視頻)或者正在完成用戶請求的任務(wù)(例如,在網(wǎng)絡(luò)連接上發(fā)送數(shù)據(jù),寫入文件,打印,等等),也可以認(rèn)為用戶正在主動(dòng)與前臺(tái)組件交互。
[0071]在一些實(shí)施例中,當(dāng)用戶不再主動(dòng)與前臺(tái)組件交互時(shí),操作系統(tǒng)可以將前臺(tái)組件從激活狀態(tài)205移動(dòng)到掛起狀態(tài)210。這例如發(fā)生在用戶將焦點(diǎn)切換到不同應(yīng)用的窗口時(shí),用戶將前臺(tái)組件的窗口最小化時(shí),用戶在某閾值時(shí)間段內(nèi)未向前臺(tái)組件提供任何輸入時(shí),等等。備選地或者附加地,當(dāng)前臺(tái)組件不再執(zhí)行可以被認(rèn)為是前臺(tái)活動(dòng)的任何活動(dòng)時(shí),操作系統(tǒng)可以將前臺(tái)組件從激活狀態(tài)205移動(dòng)到掛起狀態(tài)210??梢员徽J(rèn)為是前臺(tái)活動(dòng)的活動(dòng)的示例包括但不限于音頻回放、設(shè)備同步等。
[0072]在將前臺(tái)組件從激活狀態(tài)205移動(dòng)到掛起狀態(tài)210之前,操作系統(tǒng)可以通知前臺(tái)組件將要掛起前臺(tái)組件,所以前臺(tái)組件可以相應(yīng)地諸如通過保存狀態(tài)和釋放分配的資源來做好準(zhǔn)備。例如,操作系統(tǒng)可以通過調(diào)用前臺(tái)組件提供的應(yīng)用編程接口(API)函數(shù)來通知前臺(tái)組件。在更具體的示例中,如圖1和圖2所示,操作系統(tǒng)可以調(diào)用前臺(tái)組件實(shí)現(xiàn)的所謂的“靜止(Quiesce)”方法,這可以使得前臺(tái)組件保存狀態(tài)并釋放資源(例如,文件、網(wǎng)絡(luò)連接等)。在一些實(shí)現(xiàn)中,靜止方法可以包括操作系統(tǒng)代碼來明確地阻止調(diào)用靜止方法的線程(即,前臺(tái)組件的線程)被調(diào)度用于執(zhí)行。除了作為整體掛起(例如,禁止調(diào)度)整個(gè)前臺(tái)組件之外,這是可以完成的。前臺(tái)組件可以保持被阻止直到操作系統(tǒng)將前臺(tái)組件向后移動(dòng)到激活狀態(tài)205。
[0073]在一些實(shí)施例中,當(dāng)用戶開始再次與前臺(tái)組件交互時(shí),操作系統(tǒng)可以將前臺(tái)組件從掛起狀態(tài)210向回移動(dòng)到激活狀態(tài)205,例如當(dāng)通過將焦點(diǎn)切換回到前臺(tái)組件的窗口時(shí),將前臺(tái)組件的窗口從最小化狀態(tài)復(fù)原時(shí),開始向前臺(tái)組件提供輸入時(shí),等等。為此,操作系統(tǒng)可以簡單地調(diào)度前臺(tái)組件用于執(zhí)行。在一些實(shí)施例中,操作系統(tǒng)可以附加地調(diào)用前臺(tái)組件提供的API函數(shù),以幫助前臺(tái)組件恢復(fù)之前的狀態(tài)。更具體而言,在圖1和圖2所示的示例中,操作系統(tǒng)可以調(diào)用前臺(tái)組件實(shí)現(xiàn)的所謂的“重新開始(Resume)”方法,這可以使得前臺(tái)組件檢索保存的狀態(tài)并且請求合適的資源(例如,文件、網(wǎng)絡(luò)連接等)。
[0074]在一些其它實(shí)施例中,操作系統(tǒng)可以通過將前臺(tái)組件從存儲(chǔ)器中去除來將前臺(tái)組件從掛起狀態(tài)210移動(dòng)到非運(yùn)行狀態(tài)215。這樣做可以例如用于減少存儲(chǔ)器的使用或者允許更新前臺(tái)組件的可執(zhí)行代碼。如果在操作系統(tǒng)將前臺(tái)組件移動(dòng)到非運(yùn)行狀態(tài)215時(shí)應(yīng)用沒有正在后臺(tái)中運(yùn)行,則應(yīng)用可以變?yōu)橥耆K止。否則,后臺(tái)組件可以繼續(xù)運(yùn)行,而不管前臺(tái)組件如何改變狀態(tài)。
[0075]如果當(dāng)前臺(tái)組件已經(jīng)移動(dòng)到非運(yùn)行狀態(tài)215時(shí)用戶開始再次與前臺(tái)組件交互,則操作系統(tǒng)可以再次啟動(dòng)前臺(tái)組件,這可以類似于上面所討論的初始地啟動(dòng)前臺(tái)組件。
[0076]應(yīng)理解到的是,操作系統(tǒng)可以選擇用于確定何時(shí)將前臺(tái)組件從激活狀態(tài)205移動(dòng)到掛起狀態(tài)210以及何時(shí)將前臺(tái)組件從掛起狀態(tài)210移動(dòng)到非運(yùn)行狀態(tài)215的任何適當(dāng)?shù)囊?guī)則集合和技術(shù)。這些規(guī)則可以反映在與掛起前臺(tái)組件相關(guān)聯(lián)的預(yù)期成本與預(yù)期利益之間的期望平衡以及在與從存儲(chǔ)器移除前臺(tái)組件相關(guān)聯(lián)的預(yù)期成本與預(yù)期利益之間的期望平衡。例如,盡管掛起前臺(tái)組件可以帶來資源的一些節(jié)省,但前臺(tái)組件會(huì)引起附加的處理開支用于準(zhǔn)備掛起和從掛起重新開始。此外,當(dāng)前臺(tái)組件開始從掛起重新開始并嘗試重新得到資源(例如,重新打開文件,重新建立網(wǎng)絡(luò)連接,等等)時(shí)用戶可能體驗(yàn)遲緩。類似地,盡管從存儲(chǔ)器移除前臺(tái)組件可以減少存儲(chǔ)器使用,但前臺(tái)組件會(huì)引起附加處理開支用于重新啟動(dòng),并且當(dāng)前臺(tái)組件正在被重新加載和重新初始化時(shí)用戶會(huì)體驗(yàn)遲緩。
[0077]轉(zhuǎn)到圖2所示的說明性生命周期250,后臺(tái)組件可以初始地處于非運(yùn)行狀態(tài)260。在一些實(shí)施例中,操作系統(tǒng)可以響應(yīng)于檢測到一個(gè)或更多個(gè)事件的出現(xiàn)而啟動(dòng)后臺(tái)組件。如下面結(jié)合圖5至圖7更具體討論的那樣,在一些說明性實(shí)施例中,可以考慮兩種類型的事件(即,觸發(fā)器和條件)來確定何時(shí)啟動(dòng)后臺(tái)組件。
[0078]啟動(dòng)后臺(tái)組件可以涉及:向存儲(chǔ)器中加載后臺(tái)組件以及后臺(tái)組件可以訪問的任何輔助組件,初始化后臺(tái)組件,以及/或者分配合適的資源。如果在啟動(dòng)后臺(tái)組件時(shí)該應(yīng)用的前臺(tái)組件已經(jīng)正在運(yùn)行并且后臺(tái)組件加載到與前臺(tái)組件相同的進(jìn)程中,則一些輔助組件也許已被加載并且一些資源也許已被分配。否則,可以執(zhí)行完全發(fā)起。在任一個(gè)事件中,后臺(tái)組件都可以移動(dòng)到運(yùn)行狀態(tài)255。
[0079]在一些實(shí)施例中,一旦將后臺(tái)組件從存儲(chǔ)裝置加載,操作系統(tǒng)就可以通過調(diào)用后臺(tái)組件提供的API函數(shù)來執(zhí)行后臺(tái)組件的進(jìn)入點(diǎn)函數(shù),從而初始化后臺(tái)組件。在更具體的示例中,如圖1至圖2所示,操作系統(tǒng)可以調(diào)用后臺(tái)組件實(shí)現(xiàn)的所謂的“啟動(dòng)”方法。
[0080]在一些實(shí)施例中,在后臺(tái)組件啟動(dòng)之后,操作系統(tǒng)可以監(jiān)視后臺(tái)組件的進(jìn)展。一些后臺(tái)組件(例如,圖1所示的工作項(xiàng)11(^、11(?、110(:、……)可以分別對(duì)應(yīng)于分立的后臺(tái)任務(wù)(例如,從服務(wù)器下載內(nèi)容塊,檢查軟件更新的可用性,例行病毒掃描,等等)。如此,并不希望這些后臺(tái)組件無限期地運(yùn)行。如果后臺(tái)組件在運(yùn)行后某閾值時(shí)間段后還沒有足夠的進(jìn)展,則操作系統(tǒng)可以停止執(zhí)行后臺(tái)組件,由此將后臺(tái)組件移動(dòng)到非運(yùn)行狀態(tài)260。
[0081]操作系統(tǒng)可以使用任何已知的用于監(jiān)視計(jì)算任務(wù)的進(jìn)展的技術(shù)來監(jiān)視后臺(tái)組件的進(jìn)展。備選地或者附加地,應(yīng)用可以為操作系統(tǒng)提供一個(gè)或更多個(gè)工具用于監(jiān)視進(jìn)展。例如,后臺(tái)組件可以實(shí)現(xiàn)“檢查進(jìn)展”接口,操作系統(tǒng)可以調(diào)用該接口來獲得進(jìn)展信息(例如,任務(wù)完成的百分比和/或后臺(tái)組件正在等待來自另一組件的響應(yīng)還是正在等待一些資源變?yōu)榭捎???梢栽谂c應(yīng)用相關(guān)聯(lián)的規(guī)范(諸如圖1所示的規(guī)范120)中指明該接口。
[0082]在一些實(shí)施例中,操作系統(tǒng)可以通知后臺(tái)組件將要停止后臺(tái)組件,所以后臺(tái)組件可以諸如通過保存狀態(tài)和釋放分配的資源來相應(yīng)地做好準(zhǔn)備。這例如可以通過調(diào)用后臺(tái)組件提供的API函數(shù)來完成。更具體而言,在圖1至圖2所示的示例中,操作系統(tǒng)可以調(diào)用后臺(tái)組件實(shí)現(xiàn)的所謂的“取消”方法,之后在操作系統(tǒng)將后臺(tái)組件移動(dòng)到非運(yùn)行狀態(tài)260之前后臺(tái)組件可以被賦予某少量時(shí)間(例如,幾秒鐘)。
[0083]如果后臺(tái)組件繼續(xù)按照足夠速率進(jìn)展,則操作系統(tǒng)可以允許后臺(tái)組件運(yùn)行以便完成。在該情況下,操作系統(tǒng)也可以例如通過將后臺(tái)組件從存儲(chǔ)器移除來將后臺(tái)組件移動(dòng)到非運(yùn)行狀態(tài)260。
[0084]如果在操作系統(tǒng)將后臺(tái)組件移動(dòng)到非運(yùn)行狀態(tài)215時(shí)應(yīng)用沒有正在前臺(tái)中運(yùn)行,則應(yīng)用可以變?yōu)橥耆K止。否則,前臺(tái)組件可以繼續(xù)運(yùn)行(例如,處于激活狀態(tài)205或者掛起狀態(tài)210),而不管后臺(tái)組件如何改變狀態(tài)。
[0085]盡管在圖2中示出并且在上面描述了應(yīng)用組件生命周期的具體示例,但應(yīng)理解到的是,提供這些示例僅用于說明性目的。本公開內(nèi)容的各方面并不限于任何特定的生命周期的定義,也不限于任何特定的管理生命周期的方式。例如,前臺(tái)組件可以移動(dòng)通過與圖2所示不同的狀態(tài)集合,并且操作系統(tǒng)可以運(yùn)用不同的策略來確定何時(shí)將前臺(tái)組件從一個(gè)狀態(tài)移動(dòng)到另一個(gè)狀態(tài),并且針對(duì)后臺(tái)組件也類似。作為另一示例,操作系統(tǒng)可以加載同一環(huán)境(例如,軟件容器)中的相同后臺(tái)組件或不同后臺(tái)組件的一個(gè)或更多個(gè)實(shí)例,并且可以僅當(dāng)這些實(shí)例中任一個(gè)都不運(yùn)行時(shí)從存儲(chǔ)器移除該環(huán)境。作為又一示例,操作系統(tǒng)可以保持后臺(tái)組件被無限期地加載以便提高效率。
[0086]如上所述,在一些實(shí)施例中,如果前臺(tái)組件和后臺(tái)組件能夠在任一種方式中執(zhí)行,則操作系統(tǒng)可以選擇在相同進(jìn)程或者在分開的進(jìn)程中加載應(yīng)用的前臺(tái)組件和后臺(tái)組件。在一個(gè)示例中,操作系統(tǒng)可以默認(rèn)地在分開的進(jìn)程中加載前臺(tái)組件和后臺(tái)組件,除非用戶的應(yīng)用另外指明。在另一示例中,操作系統(tǒng)可以與對(duì)應(yīng)的前臺(tái)組件分開地加載應(yīng)用提供的后臺(tái)組件,但可以將操作系統(tǒng)提供的后臺(tái)組件與后臺(tái)組件正在為其工作的應(yīng)用共同定位。也可以施加其它適當(dāng)規(guī)則,因?yàn)楸竟_內(nèi)容的各方面并不限于這種方式。
[0087]圖3A示出其中操作系統(tǒng)305在進(jìn)程320中向存儲(chǔ)器300加載前臺(tái)組件310并且在分開的進(jìn)程325中向存儲(chǔ)器300加載后臺(tái)組件315的示例。以此方式將后臺(tái)工作與前臺(tái)工作隔離可以便于資源管理。例如,在一些實(shí)施例中,操作系統(tǒng)可以在受控執(zhí)行環(huán)境(例如,本領(lǐng)域已知的沙盒)中運(yùn)行進(jìn)程325,該受控執(zhí)行環(huán)境被構(gòu)造為允許在其中運(yùn)行的進(jìn)程僅訪問指定資源。以此方式,操作系統(tǒng)可以向受控執(zhí)行環(huán)境分配某指明數(shù)量的資源(例如,某指明百分比的CPU時(shí)間、存儲(chǔ)器等)以確保后臺(tái)組件315不消耗多余指明數(shù)量的資源。在一些實(shí)現(xiàn)中,受控執(zhí)行環(huán)境可以被指定用于運(yùn)行后臺(tái)組件,使得其它應(yīng)用的后臺(tái)組件也可以在沙盒中運(yùn)行并且受約束于相同的資源限制。
[0088]在分開的進(jìn)程中將后臺(tái)工作與前臺(tái)工作隔離也可以有助于減少存儲(chǔ)器占用面積,因?yàn)椴僮飨到y(tǒng)可以避免當(dāng)應(yīng)用僅在執(zhí)行后臺(tái)工作時(shí)加載僅與用戶接口(UI)功能性有關(guān)的可執(zhí)行代碼(例如,庫)。例如,在其中將前臺(tái)工作和后臺(tái)工作實(shí)現(xiàn)為分開組件的實(shí)施例中,UI有關(guān)功能性可以僅存在于前臺(tái)組件中,而這不需要在主控后臺(tái)組件的進(jìn)程中加載。
[0089]圖3B示出其中操作系統(tǒng)350在相同進(jìn)程370中將前臺(tái)組件360和后臺(tái)組件365加載到存儲(chǔ)器350中的示例。以此方式共同定位前臺(tái)工作和后臺(tái)工作可以允許前臺(tái)組件360和后臺(tái)組件365共享啟動(dòng)成本。因此,如果頻繁地運(yùn)行組件之一,例如,如果一個(gè)或更多個(gè)用戶頻繁地與應(yīng)用交互,或者如果應(yīng)用頻繁地執(zhí)行后臺(tái)工作,則共同定位這些組件可以是有利的。
[0090]在圖3B所示的示例中,前臺(tái)組件360和后臺(tái)組件365由操作系統(tǒng)355分別作為分開的線程(線程380和385)啟動(dòng)。以此方式,操作系統(tǒng)355仍然能夠分開地管理前臺(tái)組件360和后臺(tái)組件365的執(zhí)行。例如,操作系統(tǒng)可以阻止執(zhí)行線程380(并且因此阻止執(zhí)行前臺(tái)組件360),同時(shí)允許執(zhí)行線程385(并且因此允許執(zhí)行后臺(tái)組件365),并且反之亦然。
[0091]因而,在一些實(shí)施例中,操作系統(tǒng)可以適于基于在容易實(shí)現(xiàn)的資源管理與降低的啟動(dòng)成本之間的期望折衷來決定是共同定位前臺(tái)組件和后臺(tái)組件還是將前臺(tái)組件和后臺(tái)組件分開。也可以考慮其它考慮(例如,諸如存儲(chǔ)器和/或處理器使用之類的動(dòng)態(tài)操作條件、激活進(jìn)程的數(shù)目等),因?yàn)楸竟_內(nèi)容的各方面并不限于任何特定的用于共同定位或分開前臺(tái)組件和后臺(tái)組件的原因。在一個(gè)示例中,在其中可以