本發(fā)明涉及計(jì)算機(jī)處理技術(shù)領(lǐng)域,特別是涉及一種插件的多進(jìn)程管理方法和裝置。
背景技術(shù):
在軟件開(kāi)發(fā)中,為了方便對(duì)軟件進(jìn)行功能擴(kuò)展,可以采用插件方式進(jìn)行開(kāi)發(fā),將軟件所要實(shí)現(xiàn)的一個(gè)一個(gè)功能封裝在插件中,最后將各個(gè)插件集成在軟件主程序包中一同發(fā)布。
在android開(kāi)發(fā)中,為了盡可能地減少手機(jī)的內(nèi)存占用,大多數(shù)app(應(yīng)用程序)都會(huì)啟動(dòng)至少兩個(gè)進(jìn)程,一個(gè)運(yùn)行在后臺(tái)(運(yùn)行后臺(tái)任務(wù)的常駐進(jìn)程),另一個(gè)運(yùn)行在前臺(tái),提供用戶可見(jiàn)的界面(即ui進(jìn)程)。
當(dāng)用戶使用app完成一些操作后,回退到手機(jī)桌面,前臺(tái)的那個(gè)進(jìn)程會(huì)在一段時(shí)間后(比如10秒)自動(dòng)退出,以減少手機(jī)系統(tǒng)內(nèi)存占用,這便是多進(jìn)程模型。而app上的插件并不支持多進(jìn)程模型,即插件中無(wú)法同時(shí)運(yùn)行兩個(gè)或兩個(gè)以上的進(jìn)程。因此,亟待解決這一技術(shù)問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問(wèn)題,提出了本發(fā)明以便提供一種克服上述問(wèn)題或者至少部分地解決上述問(wèn)題的一種插件的多進(jìn)程管理方法和裝置。
依據(jù)本發(fā)明實(shí)施例的一方面,提供了一種插件的多進(jìn)程管理方法,包括:
在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程;
當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;
在所述每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;
當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)所述對(duì)應(yīng)關(guān)系查找所述任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;
在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件。
可選地,插件中每個(gè)組件的類型包括下列至少之一:
活動(dòng)界面activity、服務(wù)service、內(nèi)容提供者contentprovider、廣播接收器broadcastreceiver。
可選地,所述在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,包括:
獲取宿主的插件中每個(gè)組件聲明的進(jìn)程;
根據(jù)所述每個(gè)組件聲明的進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程。
可選地,所述在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,包括:
在宿主的配置文件中寫入進(jìn)程信息,以注冊(cè)各個(gè)預(yù)留進(jìn)程,其中,所述進(jìn)程信息至少包括以下信息:
進(jìn)程的編號(hào)、進(jìn)程的狀態(tài)、進(jìn)程對(duì)應(yīng)的插件名、插件中不同類型的組件的使用數(shù)量。
可選地,在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件之后,所述方法還包括:
將所述目標(biāo)預(yù)留進(jìn)程的狀態(tài)標(biāo)記為表示已分配的狀態(tài)。
可選地,所述方法還包括:
獲取宿主的插件的多個(gè)任務(wù),其中,所述多個(gè)任務(wù)各自能夠?qū)崿F(xiàn)插件的不同功能;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,其中,不同的任務(wù)各自的活動(dòng)界面屬于不同的task;
當(dāng)宿主加載插件并啟動(dòng)所述多個(gè)任務(wù)中的任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),在所述配置文件中查找所述當(dāng)前活動(dòng)界面所屬的目標(biāo)task;
在宿主中查找所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面,并依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面;
將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用。
可選地,所述task是具有棧結(jié)構(gòu)的容器,能夠放置一個(gè)或多個(gè)活動(dòng)界面。
可選地,同一個(gè)任務(wù)的活動(dòng)界面屬于同一個(gè)task。
可選地,所述在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,包括:
獲取宿主的多個(gè)task;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在所述多個(gè)task中所屬的task。
可選地,所述獲取宿主的多個(gè)task,包括:
讀取宿主的配置文件;
查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。
可選地,所述方法還包括:
在宿主中為所述多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面;
對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
可選地,所述對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,包括:
按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組,所述不同的啟動(dòng)模式包括下列任意之一:
standard、singletop、singletask、singleinstance。
可選地,所述依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面,包括:
確定所述當(dāng)前活動(dòng)界面的啟動(dòng)模式;
在所述目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組;
在所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面;
在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
可選地,所述將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用,包括:
將所述目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)所述目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面供所述當(dāng)前活動(dòng)界面使用。
依據(jù)本發(fā)明實(shí)施例的另一方面,還提供了一種插件的多進(jìn)程管理裝置,包括:
第一注冊(cè)模塊,適于在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程;
讀取模塊,適于當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;
建立模塊,適于在所述每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;
查找模塊,適于當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)所述對(duì)應(yīng)關(guān)系查找所述任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;
運(yùn)行模塊,適于在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件。
可選地,插件中每個(gè)組件的類型包括下列至少之一:
活動(dòng)界面activity、服務(wù)service、內(nèi)容提供者contentprovider、廣播接收器broadcastreceiver。
可選地,所述第一注冊(cè)模塊還適于:
獲取宿主的插件中每個(gè)組件聲明的進(jìn)程;
根據(jù)所述每個(gè)組件聲明的進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程。
可選地,所述第一注冊(cè)模塊還適于:
在宿主的配置文件中寫入進(jìn)程信息,以注冊(cè)各個(gè)預(yù)留進(jìn)程,其中,所述進(jìn)程信息至少包括以下信息:
進(jìn)程的編號(hào)、進(jìn)程的狀態(tài)、進(jìn)程對(duì)應(yīng)的插件名、插件中不同類型的組件的使用數(shù)量。
可選地,所述裝置還包括:
標(biāo)記模塊,適于在所述運(yùn)行模塊在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件之后,將所述目標(biāo)預(yù)留進(jìn)程的狀態(tài)標(biāo)記為表示已分配的狀態(tài)。
可選地,所述裝置還包括:
獲取模塊,適于獲取宿主的插件的多個(gè)任務(wù),其中,所述多個(gè)任務(wù)各自能夠?qū)崿F(xiàn)插件的不同功能;
第二注冊(cè)模塊,適于在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,其中,不同的任務(wù)各自的活動(dòng)界面屬于不同的task;
選取模塊,適于在宿主中查找所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面,并依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面;
分配模塊,適于將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用。
可選地,所述task是具有棧結(jié)構(gòu)的容器,能夠放置一個(gè)或多個(gè)活動(dòng)界面。
可選地,同一個(gè)任務(wù)的活動(dòng)界面屬于同一個(gè)task。
可選地,所述第二注冊(cè)模塊還適于:
獲取宿主的多個(gè)task;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在所述多個(gè)task中所屬的task。
可選地,所述第二注冊(cè)模塊還適于:
讀取宿主的配置文件;
查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。
可選地,所述裝置還包括:
配置模塊,適于在宿主中為所述多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面;對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
可選地,所述配置模塊還適于:
按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組,所述不同的啟動(dòng)模式包括下列任意之一:
standard、singletop、singletask、singleinstance。
可選地,所述選取模塊還適于:
確定所述當(dāng)前活動(dòng)界面的啟動(dòng)模式;
在所述目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組;
在所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面;
在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
可選地,所述分配模塊還適于:
將所述目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)所述目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面供所述當(dāng)前活動(dòng)界面使用。
在本發(fā)明實(shí)施例中,在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;隨后,在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;之后,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件。可以看到,本發(fā)明實(shí)施例在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系,從而,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程,進(jìn)而在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件,解決了現(xiàn)有技術(shù)中插件的組件只能運(yùn)行在同一個(gè)進(jìn)程的問(wèn)題,實(shí)現(xiàn)了插件的多進(jìn)程運(yùn)行的目的。
上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書(shū)的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
根據(jù)下文結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的詳細(xì)描述,本領(lǐng)域技術(shù)人員將會(huì)更加明了本發(fā)明的上述以及其他目的、優(yōu)點(diǎn)和特征。
附圖說(shuō)明
通過(guò)閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明一實(shí)施例的插件的多進(jìn)程管理方法的流程圖;
圖2a示出了根據(jù)本發(fā)明一實(shí)施例的插件中聲明的進(jìn)程的示意圖;
圖2b示出了根據(jù)本發(fā)明一實(shí)施例的預(yù)留進(jìn)程的示意圖;
圖3示出了根據(jù)本發(fā)明一實(shí)施例的動(dòng)態(tài)匹配活動(dòng)界面的方法的流程圖;
圖4示出了根據(jù)本發(fā)明一實(shí)施例task預(yù)設(shè)的多個(gè)注冊(cè)界面的分組示意圖;
圖5示出了根據(jù)本發(fā)明一實(shí)施例的選取目標(biāo)注冊(cè)界面的方法的流程圖;
圖6示出了根據(jù)本發(fā)明一實(shí)施例的實(shí)現(xiàn)插件的多任務(wù)棧的方法的流程圖;
圖7示出了根據(jù)本發(fā)明一實(shí)施例的插件的多進(jìn)程管理裝置的結(jié)構(gòu)示意圖;
圖8示出了根據(jù)本發(fā)明另一實(shí)施例的插件的多進(jìn)程管理裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開(kāi)的示例性實(shí)施例。雖然附圖中顯示了本公開(kāi)的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開(kāi)而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開(kāi),并且能夠?qū)⒈竟_(kāi)的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),是一種具有獨(dú)立功能的程序。它可以申請(qǐng)和擁有系統(tǒng)資源,是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體。進(jìn)程不只是程序的代碼,還包括當(dāng)前的活動(dòng),通過(guò)程序計(jì)數(shù)器的值和處理寄存器的內(nèi)容來(lái)表示。
如前文介紹,插件上不支持多進(jìn)程模型,即插件中無(wú)法同時(shí)運(yùn)行兩個(gè)或兩個(gè)以上的進(jìn)程。為了解決這一問(wèn)題,本發(fā)明實(shí)施例提供了一種插件的多進(jìn)程管理方法。圖1示出了根據(jù)本發(fā)明一實(shí)施例的插件的多進(jìn)程管理方法的流程圖,在圖1中,該方法至少可以包括以下步驟s102至s110。
步驟s102,在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程。
步驟s104,當(dāng)宿主加載插件時(shí),讀取該宿主加載的插件中每個(gè)組件聲明的進(jìn)程。
步驟s106,在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系。
步驟s108,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程。
步驟s110,在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件。
在本發(fā)明實(shí)施例中,在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;隨后,在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;之后,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件。可以看到,本發(fā)明實(shí)施例在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系,從而,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程,進(jìn)而在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件,解決了現(xiàn)有技術(shù)中插件的組件只能運(yùn)行在同一個(gè)進(jìn)程的問(wèn)題,實(shí)現(xiàn)了插件的多進(jìn)程運(yùn)行的目的。
上文步驟s102中在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,本發(fā)明實(shí)施例提供了可選的方案,即,獲取宿主的插件中每個(gè)組件聲明的進(jìn)程,進(jìn)而根據(jù)每個(gè)組件聲明的進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程。這里,以android(安卓)系統(tǒng)為例,插件中每個(gè)組件的類型包括activity(活動(dòng)界面)、service(服務(wù))、contentprovider(內(nèi)容提供者)、broadcastreceiver(廣播接收器)。
如圖2a所示,獲取到宿主的插件中各組件聲明的進(jìn)程分別為進(jìn)程a、進(jìn)程b和進(jìn)程c,則根據(jù)各組件聲明的這些進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程pa、pb、pc。這里,進(jìn)程a對(duì)應(yīng)預(yù)留進(jìn)程pa,進(jìn)程b對(duì)應(yīng)預(yù)留進(jìn)程pb以及進(jìn)程c對(duì)應(yīng)預(yù)留進(jìn)程pc。需要說(shuō)明的是,此處例舉僅是示意性的,并不對(duì)本發(fā)明實(shí)施例進(jìn)行限制。如圖2b中所示的每個(gè)圓圈表示在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程。
以activity、service以及provider為例,如下所示:
<activityname=”xxxxactivity”/>
<servicename=”xxxxservice”/>
<providername=”xxxxprovider”/>
在現(xiàn)有技術(shù)中,上述這些組件使用默認(rèn)的ui進(jìn)程,無(wú)法實(shí)現(xiàn)多進(jìn)程運(yùn)行。在本發(fā)明實(shí)施中,上述這些組件可以按進(jìn)程進(jìn)行擴(kuò)展,如下所示:
<activityname=”xxxxactivity”/>
<servicename=”xxxxservice”/>
<providername=”xxxxprovider”/>
<activityname=”xxxxactivity”
process=":p1"/>
<servicename=”xxxxservice”
process=":p1"/>
<providername=”xxxxprovider”
process=":p1"/>
…
<activityname=”xxxxactivity”
process=":pn"/>
<servicename=”xxxxservice”
process=":pn"/>
<providername=”xxxxprovider"
process=":pn"/>
擴(kuò)展后,各個(gè)組件可以按照p0到pn進(jìn)程運(yùn)行。
進(jìn)一步地,步驟s102在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程時(shí),可以在宿主的配置文件中寫入進(jìn)程信息,以注冊(cè)各個(gè)預(yù)留進(jìn)程,其中,進(jìn)程信息至少可以包括進(jìn)程的編號(hào)、進(jìn)程的狀態(tài)、進(jìn)程對(duì)應(yīng)的插件名、插件中不同類型的組件的使用數(shù)量,等等,本發(fā)明實(shí)施例不限于此。
在步驟s110在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件之后,還可以將目標(biāo)預(yù)留進(jìn)程的狀態(tài)標(biāo)記為表示已分配的狀態(tài),以表示目標(biāo)預(yù)留進(jìn)程被占用。
本發(fā)明實(shí)施例除了可以實(shí)現(xiàn)多進(jìn)程匹配,還可以根據(jù)插件activity的taskaffinity的區(qū)分并動(dòng)態(tài)匹配activity。
圖3示出了根據(jù)本發(fā)明一實(shí)施例的動(dòng)態(tài)匹配活動(dòng)界面的方法的流程圖,在android系統(tǒng)中,活動(dòng)界面為activity。在圖3中,該方法至少包括以下步驟s302至s310。
步驟s302,獲取宿主的插件的多個(gè)任務(wù),其中,多個(gè)任務(wù)各自能夠?qū)崿F(xiàn)插件的不同功能。
在該步驟中,例如手機(jī)衛(wèi)士上的防盜插件有多個(gè)任務(wù),分別能夠?qū)崿F(xiàn)定位、報(bào)警等功能。
步驟s304,在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,其中,不同的任務(wù)各自的活動(dòng)界面屬于不同的task。
步驟s306,當(dāng)宿主加載插件并啟動(dòng)多個(gè)任務(wù)中的任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),在配置文件中查找當(dāng)前活動(dòng)界面所屬的目標(biāo)task。
步驟s308,在宿主中查找目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面,并依據(jù)預(yù)設(shè)的選取策略從目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面。
步驟s310,將目標(biāo)注冊(cè)界面分配給當(dāng)前活動(dòng)界面使用。
可以看到,本發(fā)明實(shí)施例在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,并且不同的任務(wù)各自的活動(dòng)界面屬于不同的task,這樣使得不同的任務(wù)之間能夠自由切換,無(wú)需退出任務(wù)。并且,本發(fā)明實(shí)施例在啟動(dòng)任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),能夠從當(dāng)前活動(dòng)界面所屬的目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面,將目標(biāo)注冊(cè)界面分配給當(dāng)前活動(dòng)界面使用,保證了任務(wù)界面的正常啟動(dòng)。
宿主的task是固定的,且有多個(gè),每個(gè)task包含多個(gè)活動(dòng)界面,都預(yù)埋或配置在宿主的配置文件中。以android系統(tǒng)為例,宿主的每個(gè)task包含多個(gè)activity,都預(yù)埋在宿主的配置文件androidmanifest.xml中。宿主的每個(gè)task中能夠放置或裝載多個(gè)activity,其回退和打開(kāi)的順序邏輯和基本的數(shù)據(jù)結(jié)構(gòu)棧是一致的。
進(jìn)一步地,步驟s304中在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,本發(fā)明實(shí)施例提供了一種可選的方案,在該方案中,可以獲取宿主的多個(gè)task,進(jìn)而在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面在多個(gè)task中所屬的task。例如,宿主的多個(gè)task分別為task1、task2、task3,則可以在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面屬于task1、task2或者task3,需要說(shuō)明的是,此處例舉僅是示意性的,并不對(duì)本發(fā)明實(shí)施例進(jìn)行限制。
此外,步驟s304中限定了不同的任務(wù)各自的活動(dòng)界面屬于不同的task,從而使得不同的任務(wù)之間能夠自由切換,無(wú)需退出任務(wù)。在可選的實(shí)施例中,為了保證同一任務(wù)的不同活動(dòng)界面的快速、有效切換,同一個(gè)任務(wù)的活動(dòng)界面屬于同一個(gè)task。
在本發(fā)明的可選實(shí)施例中,上述在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面在多個(gè)task中所屬的task時(shí),可以在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在多個(gè)task中所屬的task。仍然以上述例舉為例,對(duì)于多個(gè)任務(wù)中的各個(gè)任務(wù),可以在宿主的配置文件中注冊(cè)各個(gè)任務(wù)的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面屬于task1、task2或者task3。
如上文介紹,宿主的task是固定的,且有多個(gè),每個(gè)task包含多個(gè)活動(dòng)界面,都預(yù)埋或配置在宿主的配置文件中。因而,上述獲取宿主的多個(gè)task時(shí),可以讀取宿主的配置文件,進(jìn)而查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。進(jìn)一步地,本發(fā)明實(shí)施例還可以在宿主中為多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面,以提供給活動(dòng)界面使用,并且對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
在本發(fā)明的可選實(shí)施例中,將不同的啟動(dòng)模式分配給各個(gè)注冊(cè)界面的launchmode屬性,以指示各個(gè)注冊(cè)界面的啟動(dòng)模式,這里,不同的啟動(dòng)模式可以包括standard、singletop、singletask、singleinstance中的任意之一。以android系統(tǒng)為例,下面將詳細(xì)介紹這幾種啟動(dòng)模式的區(qū)別。
(1)哪個(gè)任務(wù)存放著activity,用來(lái)對(duì)行為進(jìn)行響應(yīng)。對(duì)standard和singletop這兩個(gè)啟動(dòng)模式來(lái)說(shuō),這個(gè)任務(wù)是產(chǎn)生行為,并且調(diào)用startactivity()的那個(gè)。
(2)它們是否可以有多個(gè)實(shí)例。standard和singletop類型的activity可以被實(shí)例化多次。它們可以屬于多個(gè)任務(wù),一個(gè)特定的任務(wù)也可以擁有同一個(gè)activity的多個(gè)實(shí)例。
(3)作為比較singletask和singleinstance類型的activity只限定有一個(gè)實(shí)例。因?yàn)檫@些activity是任務(wù)的根。這個(gè)限制意味著,在設(shè)備上不能同時(shí)有超過(guò)一個(gè)任務(wù)的實(shí)例。
(4)是否能有其他的activity在它所在的任務(wù)中。singleinstance類型的activity是它所在任務(wù)中唯一的activity。如果它啟動(dòng)了其他的activity,不管那個(gè)activity的啟動(dòng)模式如何,它都會(huì)加載到一個(gè)不同的任務(wù)中。在其他的方面,singleinstance和singletask啟動(dòng)模式是相同的。
(5)其他三種模式運(yùn)行任務(wù)中有多個(gè)activity。singletask總是任務(wù)中的根activity,但是它可以啟動(dòng)其他的activity并分配到它所在的任務(wù)中。standard和singletop類型的activity可以出現(xiàn)在任務(wù)中的任何地方。
(6)是否啟動(dòng)一個(gè)新的實(shí)例來(lái)處理一個(gè)新的行為。對(duì)默認(rèn)的standard啟動(dòng)模式來(lái)說(shuō),對(duì)于每一個(gè)行為都會(huì)創(chuàng)建一個(gè)新的實(shí)例來(lái)響應(yīng)。每個(gè)實(shí)例只處理一個(gè)行為。對(duì)于singletop啟動(dòng)模式,如果一個(gè)已經(jīng)存在的實(shí)例位于目標(biāo)任務(wù)activity棧的棧頂,那么它將被重用來(lái)處理這個(gè)行為。如果它不在棧頂,它將不會(huì)被重用,而是為行為創(chuàng)建一個(gè)新的實(shí)例,并壓入棧中。
例如,一個(gè)任務(wù)的activity棧由根activitya、b、c和d從上到下按這樣的順序組成,所以這個(gè)棧就是a-b-c-d。一個(gè)行為指向類型為d的activity。如果d是默認(rèn)的standard啟動(dòng)模式,一個(gè)新的實(shí)例會(huì)被啟動(dòng),棧現(xiàn)在就是這樣a-b-c-d-d。但是,如果d的加載模式是singletop,已經(jīng)存在的實(shí)例會(huì)用來(lái)處理這個(gè)行為(因?yàn)樗跅5捻敹?,并且棧中還應(yīng)該是a-b-c-d。
在前面提到,singletask和singleinstance類型的activity最多只有一個(gè)實(shí)例,所以它們的實(shí)例應(yīng)該會(huì)處理每個(gè)新的行為。singleinstance類型的activity總是在棧的頂端(因?yàn)樗侨蝿?wù)中唯一的一個(gè)activity),所以總是能夠適當(dāng)?shù)奶幚硇袨?。然而,singletask類型的activity也許會(huì)有其他的activity在它的上面。如果是這樣的話,那就不能處理這個(gè)行為,這個(gè)行為被丟棄。即使這個(gè)行為被丟棄了,它的到來(lái)也會(huì)導(dǎo)致那些應(yīng)該保留不變?nèi)蝿?wù)顯示到前臺(tái)來(lái)。
進(jìn)一步地,在對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組時(shí),可以按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組。
如圖4所示,存在launchmode為singletask的行1),為standard的行2),以及為singletop的行3)。圖4中的每個(gè)圓圈表示注冊(cè)界面,可以看到,1)已被占用了兩個(gè)注冊(cè)界面,2)被占用一個(gè)注冊(cè)界面,3)沒(méi)有被占用。在理解時(shí)類似停車位,假如用戶想停車,則應(yīng)該有如下幾個(gè)步驟。
步驟1,首先要知道自己是什么車。如果是轎車,則可以停;如果是水泥罐車,也許就不行了。也即明確自己的activity類型,不能把singletask的activity停在standard的位置上。
步驟2,通過(guò)觀察或者咨詢物業(yè)管理員,以尋找適合自己的空余車位。也即從多個(gè)注冊(cè)界面尋找應(yīng)該使用哪個(gè)。
步驟3,將車準(zhǔn)確停在車位上。也即將目標(biāo)注冊(cè)界面分配給當(dāng)前活動(dòng)界面使用。
步驟4,下次找時(shí),直接找車位即可。畢竟相似的車很常見(jiàn)。也就是說(shuō),直接通過(guò)遍歷所有注冊(cè)界面,從中尋找符合的目標(biāo)注冊(cè)界面即可。
基于上述對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面的分組,即一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組,上文步驟s308中依據(jù)預(yù)設(shè)的選取策略從目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面,本發(fā)明實(shí)施例提供了一種可選的方案,圖5示出了根據(jù)本發(fā)明一實(shí)施例的選取目標(biāo)注冊(cè)界面的方法的流程圖。如圖5所示,該方法至少可以包括以下步驟s502至s508。
步驟s502,確定當(dāng)前活動(dòng)界面的啟動(dòng)模式。
步驟s504,在目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組。
步驟s506,在當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面。
步驟s508,在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
本發(fā)明實(shí)施例基于不同的啟動(dòng)模式選取目標(biāo)注冊(cè)界面,實(shí)現(xiàn)快速、有效地選取目的,保證了任務(wù)界面的正常啟動(dòng)。
進(jìn)一步地,在上文步驟s310中將目標(biāo)注冊(cè)界面分配給當(dāng)前活動(dòng)界面使用時(shí),本發(fā)明實(shí)施例可以將目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面,供當(dāng)前活動(dòng)界面使用。
下面將通過(guò)一具體實(shí)施例來(lái)詳細(xì)介紹本發(fā)明的實(shí)現(xiàn)插件的多任務(wù)棧的方法的過(guò)程。該實(shí)施例以android系統(tǒng)為例,活動(dòng)界面為activity,task為activity棧,宿主的配置文件為androidmanifest.xml。
圖6示出了根據(jù)本發(fā)明一實(shí)施例的實(shí)現(xiàn)插件的多任務(wù)棧的方法的流程圖。如圖6所示,該方法至少可以包括以下步驟s602至s620。
步驟s602,讀取宿主的配置文件,查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。
步驟s604,在宿主中為多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面。
步驟s606,對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
在該步驟中,例如可以分組為n組,每組有m個(gè)注冊(cè)界面。并且,可以按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組。這里,不同的啟動(dòng)模式可以包括standard、singletop、singletask、singleinstance中的任意之一,關(guān)于各種啟動(dòng)模式的區(qū)別請(qǐng)參見(jiàn)前文介紹,此處不再贅述。
步驟s608,獲取宿主的插件的多個(gè)任務(wù)。
在該步驟中,插件的多個(gè)任務(wù),其各自能夠?qū)崿F(xiàn)插件的不同功能。
步驟s610,在宿主的配置文件中,注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面在宿主的多個(gè)task中所屬的task。
例如,宿主的多個(gè)task分別為task1、task2、task3,則可以在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面屬于task1、task2或者task3,需要說(shuō)明的是,此處例舉僅是示意性的,并不對(duì)本發(fā)明實(shí)施例進(jìn)行限制。
進(jìn)一步地,可以在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在多個(gè)task中所屬的task。仍然以上述例舉為例,對(duì)于多個(gè)任務(wù)中的各個(gè)任務(wù),可以在宿主的配置文件中注冊(cè)各個(gè)任務(wù)的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面屬于task1、task2或者task3。
步驟s612,當(dāng)宿主加載插件并啟動(dòng)多個(gè)任務(wù)中的任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),在配置文件中查找當(dāng)前活動(dòng)界面所屬的目標(biāo)task。
步驟s614,確定當(dāng)前活動(dòng)界面的啟動(dòng)模式,在目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組。
步驟s616,在當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面。
步驟s618,在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
步驟s620,將目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面,供當(dāng)前活動(dòng)界面使用。
舉例來(lái)說(shuō),在宿主的配置文件androidmanifest.xml中注冊(cè)插件的某個(gè)任務(wù)的activity1屬于task1,則框架會(huì)到宿主中查找task1的所有activity,找到合適的activity的時(shí)候,就將它分配給插件的activity1使用。
本發(fā)明實(shí)施例在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,并且不同的任務(wù)各自的活動(dòng)界面屬于不同的task,這樣使得不同的任務(wù)之間能夠自由切換,無(wú)需退出任務(wù)。并且,本發(fā)明實(shí)施例在啟動(dòng)任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),能夠從當(dāng)前活動(dòng)界面所屬的目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面,將目標(biāo)注冊(cè)界面分配給當(dāng)前活動(dòng)界面使用,保證了任務(wù)界面的正常啟動(dòng)。
需要說(shuō)明的是,實(shí)際應(yīng)用中,上述所有可選實(shí)施方式可以采用結(jié)合的方式任意組合,形成本發(fā)明的可選實(shí)施例,在此不再一一贅述。
基于上文各個(gè)實(shí)施例提供的插件的多進(jìn)程管理方法,基于同一發(fā)明構(gòu)思,本發(fā)明實(shí)施例還提供了一種插件的多進(jìn)程管理裝置。
圖7示出了根據(jù)本發(fā)明一實(shí)施例的插件的多進(jìn)程管理裝置的結(jié)構(gòu)示意圖。如圖7所示,該裝置至少可以包括第一注冊(cè)模塊710、讀取模塊720、建立模塊730、查找模塊740以及運(yùn)行模塊750。
現(xiàn)介紹本發(fā)明實(shí)施例的插件的多進(jìn)程管理裝置的各組成或器件的功能以及各部分間的連接關(guān)系:
第一注冊(cè)模塊710,適于在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程;
讀取模塊720,與第一注冊(cè)模塊710相耦合,適于當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;
建立模塊730,與讀取模塊720相耦合,適于在所述每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;
查找模塊740,與建立模塊730相耦合,適于當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)所述對(duì)應(yīng)關(guān)系查找所述任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;
運(yùn)行模塊750,與查找模塊740相耦合,適于在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件。
在本發(fā)明一實(shí)施例中,插件中每個(gè)組件的類型包括下列至少之一:
活動(dòng)界面activity、服務(wù)service、內(nèi)容提供者contentprovider、廣播接收器broadcastreceiver。
在本發(fā)明一實(shí)施例中,所述第一注冊(cè)模塊710還適于:
獲取宿主的插件中每個(gè)組件聲明的進(jìn)程;
根據(jù)所述每個(gè)組件聲明的進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程。
在本發(fā)明一實(shí)施例中,所述第一注冊(cè)模塊710還適于:
在宿主的配置文件中寫入進(jìn)程信息,以注冊(cè)各個(gè)預(yù)留進(jìn)程,其中,所述進(jìn)程信息至少包括以下信息:
進(jìn)程的編號(hào)、進(jìn)程的狀態(tài)、進(jìn)程對(duì)應(yīng)的插件名、插件中不同類型的組件的使用數(shù)量。
在本發(fā)明一實(shí)施例中,如圖8所示,上文圖7展示的裝置還可以包括:
標(biāo)記模塊810,與運(yùn)行模塊750相耦合,適于在所述運(yùn)行模塊750在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件之后,將所述目標(biāo)預(yù)留進(jìn)程的狀態(tài)標(biāo)記為表示已分配的狀態(tài)。
在本發(fā)明一實(shí)施例中,上文圖7展示的裝置還可以包括:
獲取模塊(附圖中未示出),適于獲取宿主的插件的多個(gè)任務(wù),其中,所述多個(gè)任務(wù)各自能夠?qū)崿F(xiàn)插件的不同功能;
第二注冊(cè)模塊(附圖中未示出),與獲取模塊相耦合,適于在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,其中,不同的任務(wù)各自的活動(dòng)界面屬于不同的task;
選取模塊(附圖中未示出),與第二注冊(cè)模塊相耦合,適于在宿主中查找所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面,并依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面;
分配模塊(附圖中未示出),與選取模塊相耦合,適于將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用。
在本發(fā)明一實(shí)施例中,所述task是具有棧結(jié)構(gòu)的容器,能夠放置一個(gè)或多個(gè)活動(dòng)界面。
在本發(fā)明一實(shí)施例中,同一個(gè)任務(wù)的活動(dòng)界面屬于同一個(gè)task。
在本發(fā)明一實(shí)施例中,所述第二注冊(cè)模塊還適于:
獲取宿主的多個(gè)task;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在所述多個(gè)task中所屬的task。
在本發(fā)明一實(shí)施例中,所述第二注冊(cè)模塊還適于:
讀取宿主的配置文件;
查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。
在本發(fā)明一實(shí)施例中,上文圖7展示的裝置還可以包括:
配置模塊(附圖中未示出),適于在宿主中為所述多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面;對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
在本發(fā)明一實(shí)施例中,所述配置模塊還適于:
按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組,所述不同的啟動(dòng)模式包括下列任意之一:
standard、singletop、singletask、singleinstance。
在本發(fā)明一實(shí)施例中,所述選取模塊還適于:
確定所述當(dāng)前活動(dòng)界面的啟動(dòng)模式;
在所述目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組;
在所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面;
在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
在本發(fā)明一實(shí)施例中,所述分配模塊還適于:
將所述目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)所述目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面供所述當(dāng)前活動(dòng)界面使用。
根據(jù)上述任意一個(gè)可選實(shí)施例或多個(gè)可選實(shí)施例的組合,本發(fā)明實(shí)施例能夠達(dá)到如下有益效果:
在本發(fā)明實(shí)施例中,在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;隨后,在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;之后,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件。可以看到,本發(fā)明實(shí)施例在每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系,從而,當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)對(duì)應(yīng)關(guān)系查找任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程,進(jìn)而在目標(biāo)預(yù)留進(jìn)程中運(yùn)行任意組件,解決了現(xiàn)有技術(shù)中插件的組件只能運(yùn)行在同一個(gè)進(jìn)程的問(wèn)題,實(shí)現(xiàn)了插件的多進(jìn)程運(yùn)行的目的。
進(jìn)一步地,本發(fā)明實(shí)施例在宿主的配置文件中注冊(cè)多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,并且不同的任務(wù)各自的活動(dòng)界面屬于不同的task,這樣使得不同的任務(wù)之間能夠自由切換,無(wú)需退出任務(wù)。并且,本發(fā)明實(shí)施例在啟動(dòng)任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),能夠從當(dāng)前活動(dòng)界面所屬的目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面,將目標(biāo)注冊(cè)界面分配給當(dāng)前活動(dòng)界面使用,保證了任務(wù)界面的正常啟動(dòng)。
在此處所提供的說(shuō)明書(shū)中,說(shuō)明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說(shuō)明書(shū)的理解。
類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開(kāi)并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開(kāi)的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說(shuō),如下面的權(quán)利要求書(shū)所反映的那樣,發(fā)明方面在于少于前面公開(kāi)的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書(shū)由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中。可以把實(shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過(guò)程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的所有特征以及如此公開(kāi)的任何方法或者設(shè)備的所有過(guò)程或單元進(jìn)行組合。除非另外明確陳述,本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來(lái)代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在權(quán)利要求書(shū)中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來(lái)使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(dsp)來(lái)實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的一種插件的多進(jìn)程管理裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說(shuō)明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來(lái)實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過(guò)同一個(gè)硬件項(xiàng)來(lái)具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
至此,本領(lǐng)域技術(shù)人員應(yīng)認(rèn)識(shí)到,雖然本文已詳盡示出和描述了本發(fā)明的多個(gè)示例性實(shí)施例,但是,在不脫離本發(fā)明精神和范圍的情況下,仍可根據(jù)本發(fā)明公開(kāi)的內(nèi)容直接確定或推導(dǎo)出符合本發(fā)明原理的許多其他變型或修改。因此,本發(fā)明的范圍應(yīng)被理解和認(rèn)定為覆蓋了所有這些其他變型或修改。
依據(jù)本發(fā)明實(shí)施例的一方面,提供了a1.一種插件的多進(jìn)程管理方法,包括:
在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程;
當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;
在所述每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;
當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)所述對(duì)應(yīng)關(guān)系查找所述任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;
在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件。
a2.根據(jù)a1所述的方法,其中,插件中每個(gè)組件的類型包括下列至少之一:
活動(dòng)界面activity、服務(wù)service、內(nèi)容提供者contentprovider、廣播接收器broadcastreceiver。
a3.根據(jù)a1或a2所述的方法,其中,所述在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,包括:
獲取宿主的插件中每個(gè)組件聲明的進(jìn)程;
根據(jù)所述每個(gè)組件聲明的進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程。
a4.根據(jù)a1-a3中任一項(xiàng)所述的方法,其中,所述在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程,包括:
在宿主的配置文件中寫入進(jìn)程信息,以注冊(cè)各個(gè)預(yù)留進(jìn)程,其中,所述進(jìn)程信息至少包括以下信息:
進(jìn)程的編號(hào)、進(jìn)程的狀態(tài)、進(jìn)程對(duì)應(yīng)的插件名、插件中不同類型的組件的使用數(shù)量。
a5.根據(jù)a4所述的方法,其中,在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件之后,所述方法還包括:
將所述目標(biāo)預(yù)留進(jìn)程的狀態(tài)標(biāo)記為表示已分配的狀態(tài)。
a6.根據(jù)a1-a5中任一項(xiàng)所述的方法,其中,還包括:
獲取宿主的插件的多個(gè)任務(wù),其中,所述多個(gè)任務(wù)各自能夠?qū)崿F(xiàn)插件的不同功能;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,其中,不同的任務(wù)各自的活動(dòng)界面屬于不同的task;
當(dāng)宿主加載插件并啟動(dòng)所述多個(gè)任務(wù)中的任意任務(wù)的當(dāng)前活動(dòng)界面時(shí),在所述配置文件中查找所述當(dāng)前活動(dòng)界面所屬的目標(biāo)task;
在宿主中查找所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面,并依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面;
將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用。
a7.根據(jù)a6所述的方法,其中,所述task是具有棧結(jié)構(gòu)的容器,能夠放置一個(gè)或多個(gè)活動(dòng)界面。
a8.根據(jù)a6或a7所述的方法,其中,同一個(gè)任務(wù)的活動(dòng)界面屬于同一個(gè)task。
a9.根據(jù)a6-a8中任一項(xiàng)所述的方法,其中,所述在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,包括:
獲取宿主的多個(gè)task;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在所述多個(gè)task中所屬的task。
a10.根據(jù)a9所述的方法,其中,所述獲取宿主的多個(gè)task,包括:
讀取宿主的配置文件;
查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。
a11.根據(jù)a9或a10所述的方法,其中,還包括:
在宿主中為所述多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面;
對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
a12.根據(jù)a11所述的方法,其中,所述對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,包括:
按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組,所述不同的啟動(dòng)模式包括下列任意之一:
standard、singletop、singletask、singleinstance。
a13.根據(jù)a12所述的方法,其中,所述依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面,包括:
確定所述當(dāng)前活動(dòng)界面的啟動(dòng)模式;
在所述目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組;
在所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面;
在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
a14.根據(jù)a13所述的方法,其中,所述將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用,包括:
將所述目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)所述目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面供所述當(dāng)前活動(dòng)界面使用。
依據(jù)本發(fā)明實(shí)施例的另一方面,提供了b15.一種插件的多進(jìn)程管理裝置,包括:
第一注冊(cè)模塊,適于在宿主的配置文件中注冊(cè)多個(gè)預(yù)留進(jìn)程;
讀取模塊,適于當(dāng)宿主加載插件時(shí),讀取宿主加載的插件中每個(gè)組件聲明的進(jìn)程;
建立模塊,適于在所述每個(gè)組件聲明的進(jìn)程與注冊(cè)的多個(gè)預(yù)留進(jìn)程之間建立對(duì)應(yīng)關(guān)系;
查找模塊,適于當(dāng)在插件中啟動(dòng)任意組件時(shí),根據(jù)所述對(duì)應(yīng)關(guān)系查找所述任意組件聲明的進(jìn)程對(duì)應(yīng)的目標(biāo)預(yù)留進(jìn)程;
運(yùn)行模塊,適于在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件。
b16.根據(jù)b15所述的裝置,其中,插件中每個(gè)組件的類型包括下列至少之一:
活動(dòng)界面activity、服務(wù)service、內(nèi)容提供者contentprovider、廣播接收器broadcastreceiver。
b17.根據(jù)b15或b16所述的裝置,其中,所述第一注冊(cè)模塊還適于:
獲取宿主的插件中每個(gè)組件聲明的進(jìn)程;
根據(jù)所述每個(gè)組件聲明的進(jìn)程,在宿主的配置文件中注冊(cè)相應(yīng)的多個(gè)預(yù)留進(jìn)程。
b18.根據(jù)b15-b17中任一項(xiàng)所述的裝置,其中,所述第一注冊(cè)模塊還適于:
在宿主的配置文件中寫入進(jìn)程信息,以注冊(cè)各個(gè)預(yù)留進(jìn)程,其中,所述進(jìn)程信息至少包括以下信息:
進(jìn)程的編號(hào)、進(jìn)程的狀態(tài)、進(jìn)程對(duì)應(yīng)的插件名、插件中不同類型的組件的使用數(shù)量。
b19.根據(jù)b18所述的裝置,其中,還包括:
標(biāo)記模塊,適于在所述運(yùn)行模塊在所述目標(biāo)預(yù)留進(jìn)程中運(yùn)行所述任意組件之后,將所述目標(biāo)預(yù)留進(jìn)程的狀態(tài)標(biāo)記為表示已分配的狀態(tài)。
b20.根據(jù)b15-b19中任一項(xiàng)所述的裝置,其中,還包括:
獲取模塊,適于獲取宿主的插件的多個(gè)任務(wù),其中,所述多個(gè)任務(wù)各自能夠?qū)崿F(xiàn)插件的不同功能;
第二注冊(cè)模塊,適于在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面所屬的task,其中,不同的任務(wù)各自的活動(dòng)界面屬于不同的task;
選取模塊,適于在宿主中查找所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面,并依據(jù)預(yù)設(shè)的選取策略從所述目標(biāo)task對(duì)應(yīng)的所有注冊(cè)界面中選取目標(biāo)注冊(cè)界面;
分配模塊,適于將所述目標(biāo)注冊(cè)界面分配給所述當(dāng)前活動(dòng)界面使用。
b21.根據(jù)b20所述的裝置,其中,所述task是具有棧結(jié)構(gòu)的容器,能夠放置一個(gè)或多個(gè)活動(dòng)界面。
b22.根據(jù)b20或b21所述的裝置,其中,同一個(gè)任務(wù)的活動(dòng)界面屬于同一個(gè)task。
b23.根據(jù)b20-b22中任一項(xiàng)所述的裝置,其中,所述第二注冊(cè)模塊還適于:
獲取宿主的多個(gè)task;
在宿主的配置文件中注冊(cè)所述多個(gè)任務(wù)各自的活動(dòng)界面的taskaffinity屬性,由該屬性指示活動(dòng)界面在所述多個(gè)task中所屬的task。
b24.根據(jù)b23所述的裝置,其中,所述第二注冊(cè)模塊還適于:
讀取宿主的配置文件;
查找在宿主的配置文件中注冊(cè)的宿主的多個(gè)task。
b25.根據(jù)b23或b24所述的裝置,其中,還包括:
配置模塊,適于在宿主中為所述多個(gè)task中的各個(gè)task預(yù)設(shè)多個(gè)注冊(cè)界面;對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,各組對(duì)應(yīng)一個(gè)或多個(gè)注冊(cè)界面。
b26.根據(jù)b25所述的裝置,其中,所述配置模塊還適于:
按照不同的啟動(dòng)模式對(duì)各個(gè)task預(yù)設(shè)的多個(gè)注冊(cè)界面進(jìn)行分組,其中,一種啟動(dòng)模式對(duì)應(yīng)一個(gè)組,所述不同的啟動(dòng)模式包括下列任意之一:
standard、singletop、singletask、singleinstance。
b27.根據(jù)b26所述的裝置,其中,所述選取模塊還適于:
確定所述當(dāng)前活動(dòng)界面的啟動(dòng)模式;
在所述目標(biāo)task對(duì)應(yīng)的多組注冊(cè)界面中,查找所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組;
在所述當(dāng)前活動(dòng)界面的啟動(dòng)模式對(duì)應(yīng)的分組中查找所有注冊(cè)界面;
在查找到的所有注冊(cè)界面中確定使用狀態(tài)為空余狀態(tài)的注冊(cè)界面,并從中選取任意注冊(cè)界面作為目標(biāo)注冊(cè)界面。
b28.根據(jù)b27所述的裝置,其中,所述分配模塊還適于:
將所述目標(biāo)注冊(cè)界面的信息傳遞給插件的加載器,由插件的加載器根據(jù)所述目標(biāo)注冊(cè)界面的信息啟動(dòng)目標(biāo)注冊(cè)界面供所述當(dāng)前活動(dòng)界面使用。