本發(fā)明涉及Android系統(tǒng)的開發(fā)領域,具體涉及一種判斷應用程序是否被安裝的方法及其判斷系統(tǒng)。
背景技術:
在Android系統(tǒng)的開發(fā)過程中有時候需要判定應用程序是否被安裝,如果應用程序安裝了,用戶就能啟動該應用程序,如果應用程序沒有被安裝,則會提示用戶進行應用的下載和安裝操作。
傳統(tǒng)的判定應用程序是否被安裝的方法非常復雜,需要對應用程序進行多次循環(huán)判定,效率低下且使用起來非常繁瑣。尤其是在多次進行判定應用程序是否安裝的時候,由于會多次循環(huán)判定導致效率明顯低下的問題。
技術實現(xiàn)要素:
針對現(xiàn)有技術中存在的缺陷,本發(fā)明的目的在于提供一種判斷應用程序是否被安裝的方法,該方法能提高整個判斷過程的速度。
為達到以上目的,本發(fā)明采取的技術方案是:
一種判斷應用程序是否被安裝的方法,該方法包括以下步驟:
建立安裝應用程序列表集合,并將其存儲到JAVA的內(nèi)存區(qū)域的靜態(tài)區(qū)中;
獲取已安裝的應用程序的包管理者對象;
通過包管理者對象獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息,得到包信息集合;
通過循環(huán)的方式對包信息集合進行遍歷,獲取所有已安裝的應用程序的各自的包信息;
從每個包信息中獲取對應的已安裝的應用程序的包名信息;
將所有已安裝的應用程序的包名信息存儲在安裝應用程序列表集合中;以及
判斷安裝應用程序列表集合是否包含所需要判定的應用程序的包名信息,若是,則所需要判定的應用程序已經(jīng)安裝,若否,則所需要判定的應用程序沒有安裝。
在上述技術方案的基礎上,在Android系統(tǒng)啟動時通過開啟新的線程獲取應用程序的包管理者對象、獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息、獲取所有已安裝的應用程序的包信息以及獲取對應的已安裝的應用程序的包名信息。
在上述技術方案的基礎上,采用Thread方式開啟所述新的線程。
在上述技術方案的基礎上,調(diào)用Android系統(tǒng)的getPackageManager接口獲取已安裝的應用程序的包管理者對象。
在上述技術方案的基礎上,調(diào)用包管理者對象中的getInstalledPackages函數(shù)獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息。
在上述技術方案的基礎上,通過for循環(huán)的方式對包信息集合進行遍歷,并調(diào)用包信息集合中的get(i)函數(shù)獲得包信息集合中位置為i的包信息。
在上述技術方案的基礎上,調(diào)用包信息中的getLaunchIntentForPackage函數(shù)來獲取對應的應用程序的包名信息。
在上述技術方案的基礎上,調(diào)用安裝應用程序列表集合中的contains方法判斷所需要判定的應用程序是否安裝,若contains方法 返回true,則安裝應用程序列表集合包含所需要判定的應用程序的包名信息,若contains方法返回false,則安裝應用程序列表集合未包含所需要判定的應用程序的包名信息。
在上述技術方案的基礎上,所述方法還包括將所述contains方法封裝成函數(shù)isAppInstall的步驟,若所述isAppInstall返回true,則所需要判定的應用程序已經(jīng)安裝,若所述isAppInstall返回false,則所需要判定的應用程序沒有安裝。
與此同時本發(fā)明還提供一種判斷應用程序是否被安裝的判斷系統(tǒng),該判斷系統(tǒng)能提高整個判斷過程的速度。
為達到以上目的,本發(fā)明采取的技術方案是:
一種判斷應用程序是否被安裝的判斷系統(tǒng),包括:
包管理者對象模塊,其用于管理Android系統(tǒng)中的包信息;
包信息獲取模塊,其根據(jù)所述包管理者對象模塊獲取Android系統(tǒng)所有已安裝的應用程序的包信息,得到包信息集合;
遍歷模塊,其對包信息集合進行遍歷,獲得所有已安裝的應用程序的單個包信息;
包名信息獲取模塊,其用于從每個包信息中獲取對應的已安裝的應用程序的包名信息;
存儲模塊,其用于存儲所有已安裝的應用程序的包名信息,所述存儲模塊設于所述JAVA的內(nèi)存區(qū)域中;以及
判斷模塊,其用于判斷存儲模塊是否包含所需要判定的應用程序的包名信息,若是,則所需要判定的應用程序已經(jīng)安裝,若否,則所需要判定的應用程序未安裝。
與現(xiàn)有技術相比,本發(fā)明的優(yōu)點在于:
當需要對應用程序進行多次循環(huán)判定時,由于本發(fā)明的安裝應用 程序列表集合listApp緩存在JAVA的內(nèi)存區(qū)域的全局區(qū)中,只需要進行一次獲取應用程序的包管理者對象PackageManager、獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息、獲取所有已安裝的應用程序的包信息packageInfo以及獲取對應的已安裝的應用程序的包名信息的過程。多次循環(huán)判定只需要進行最后的步驟S7判定過程即可,這樣對于整個判斷過程的速度有很大程度的提升。此外,還將整個判定過程合理的封裝成isAppInstall函數(shù),使得使用起來十分方便。
附圖說明
圖1為本發(fā)明中判斷應用程序是否安裝的流程圖;
圖2為本發(fā)明中判斷系統(tǒng)的結構框圖。
具體實施方式
以下結合附圖對本發(fā)明作進一步詳細說明。
參見圖1所示,本發(fā)明提供一種判斷應用程序是否被安裝的方法,該方法包括以下步驟:
S1.建立安裝應用程序列表集合,并將其存儲到JAVA的內(nèi)存區(qū)域的靜態(tài)區(qū)中;
在Java中內(nèi)存區(qū)域被劃分為5大塊,分為棧區(qū),堆區(qū),靜態(tài)區(qū),文字常亮區(qū),程序代碼區(qū)。各個區(qū)的功能和特性描述如下所示:
棧區(qū)(stack):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結構中的棧。
堆區(qū)(heap):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。它與數(shù)據(jù)結構中的堆是兩種不同概念,分配方式類似于鏈表。
全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲放在一起,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,程序結束后由系統(tǒng)釋放。靜態(tài)區(qū)的數(shù)據(jù)由于存儲在單獨的一塊區(qū)域,所以全局可以訪問。
文字常量區(qū):其用于存放常量字符串,程序結束后由系統(tǒng)釋放。
程序代碼區(qū):用于存放函數(shù)體的二進制代碼。
本發(fā)明由于需要存儲已經(jīng)安裝應用程序的列表信息,并且希望能夠在程序中的全局進行訪問,所以綜合對比選擇將安裝應用程序列表集合listApp存放在內(nèi)存的靜態(tài)區(qū)中。
S2.獲取已安裝的應用程序的包管理者對象;
在Android系統(tǒng)中,系統(tǒng)提供給開發(fā)者一個專門用于包管理的包管理者對象PackageManager,這個包管理者對象PackageManager專門用于管理Android系統(tǒng)中所有安裝包的信息。包管理者對象PackageManager中的包指的是安裝包,在Android系統(tǒng)中一個包和一個應用程序是一一對應關系。
具體的,通過調(diào)用Android系統(tǒng)提供的接口getPackageManager來獲取已安裝的應用程序的包管理者對象PackageManager。
S3.通過包管理者對象獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息,得到包信息集合;
通過包管理者對象PackageManager可以獲取到當前Android系統(tǒng)的所有已安裝的應用程序的包信息。具體的,可以通過調(diào)用包管理者對象PackageManager中的getInstalledPackages函數(shù),來返回當前Android系統(tǒng)所有的包信息集合,這里將包信息集合標記為listPackage。
S4.通過循環(huán)的方式對包信息集合進行遍歷,獲取所有已安裝的 應用程序的各自的包信息;
本發(fā)明中通過for循環(huán)的方式對包集合listPackage進行遍歷,每次循環(huán)從listPackage中取出一個包信息。
具體的,可以調(diào)用包集合listPackage中的get(i)函數(shù)來獲得包集合listPackage中位置為i的元素。
獲取到的每一個元素就是一個應用程序的包信息packageInfo。
S5.從每個包信息中獲取對應的已安裝的應用程序的包名信息;
通過調(diào)用包信息packageInfo中的getLaunchIntentForPackage函數(shù)來獲取對應的已安裝的應用程序的包名信息。應用程序的包名主要用來唯一標記某一個應用程序。
S6.將所有已安裝的應用程序的包名信息存儲在安裝應用程序列表集合中;
獲取到已安裝的應用程序的包名信息后,將這些包名信息存儲在安裝應用程序列表集合listApp中。具體的,通過調(diào)用安裝應用程序列表集合listApp集合中的add方法將包名信息存儲到其中。上述方法進行全局遍歷以后,即可將所有安裝程序的包名信息全部存儲在安裝應用程序列表集合listApp中。
此外,為了不影響Android系統(tǒng)的啟動速度,上述獲取應用程序的包管理者對象PackageManager、獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息、獲取所有已安裝的應用程序的包信息packageInfo以及獲取對應的已安裝的應用程序的包名信息的過程均是在Android系統(tǒng)啟動時通過開啟新的線程進行的。
開啟線程在JAVA中常見的有下述方法:
1.線程池
線程池對線程有一定的緩存作用,通常使用情況是使用在多個線 程的時候,因為線程池會對多個線程有一定的緩存和管理功能。
2.通過Thread方式進行線程開啟
普通Thread方式開啟線程通常應用場景時單一一個線程的場景,因為Thread開啟多線程的方式不能夠?qū)Χ鄠€線程進行管理操作,僅僅能夠開啟一個線程。
Thread方式開啟子線程具體方式是調(diào)動其中的start方法,通過start方法就能夠啟動一個新的線程。
通過上面兩種方式的比較,由于本發(fā)明中僅僅開啟一個線程去執(zhí)行獲取已經(jīng)安裝應用程序的操作,所以本發(fā)明選擇Thread方式去開啟子線程。
S7.判斷安裝應用程序列表集合是否包含所需要判定的應用程序的包名信息,若是,則所需要判定的應用程序已經(jīng)安裝,若否,則所需要判定的應用程序沒有安裝。
通常一個應用程序的包名信息是不會變化的,比如微信的包名信息一旦確定后,微信的包名信息在后續(xù)所有版本的迭代中是不會進行包名變更的。所以可以根據(jù)應用程序的包名信息來判定應用程序是否已經(jīng)安裝。
如果安裝應用程序列表集合listApp中已經(jīng)包含了所需要判定的應用的包名信息,那么說明這個程序已經(jīng)被安裝了。
如果安裝應用程序列表集合listApp中沒有包含所需要判定的應用的包名信息,那么說明這個程序沒有被安裝。
安裝應用程序列表集合listApp中有一個contains方法,contains方法是描述得到的字符串是否包含某個字符串。contains方法可以用于判定包名信息是否存在,如果包名信息在安裝應用程序列表集合listApp中存在,那么contains方法會返回true,如果包名信息在安裝 應用程序列表集合listApp中不存在,那么contains方法會返回false。
為了使用起來方便,還可以上述contains方法進行封裝,將上述判定過程封裝成一個isAppInstall函數(shù),當需要判定應用程序是否安裝的時候可以直接調(diào)用封裝好的isAppInstall函數(shù)就能夠判定應用程序是否安裝了。
如果isAppInstall方法返回true,表明應用程序已經(jīng)安裝過了,如果isAppInstall返回的是false,表明應用程序是沒有安裝過的。
通過本發(fā)明中的上述方法就能夠?qū)崿F(xiàn)快速高效的判定應用是否安裝的邏輯了,當需要對應用程序進行多次循環(huán)判定時,由于安裝應用程序列表集合listApp緩存在JAVA的內(nèi)存區(qū)域的全局區(qū)中,只需要進行一次獲取應用程序的包管理者對象PackageManager、獲取當前Android系統(tǒng)的所有已安裝的應用程序的包信息、獲取所有已安裝的應用程序的包信息packageInfo以及獲取對應的已安裝的應用程序的包名信息的過程。多次循環(huán)判定只需要進行最后的步驟S7判定過程即可,這樣對于整個判斷過程的速度有很大程度的提升。此外,還將整個判定過程合理的封裝成isAppInstall函數(shù),使得使用起來十分方便。
參見圖2所示,本發(fā)明還提供一種判斷應用程序是否被安裝的判斷系統(tǒng),其包括:
包管理者對象模塊,其用于管理Android系統(tǒng)中的包信息;
包信息獲取模塊,其根據(jù)包管理者對象模塊獲取Android系統(tǒng)所有已安裝的應用程序的包信息,得到包信息集合;
遍歷模塊,其對包信息集合進行遍歷,獲得所有已安裝的應用程序的單個包信息;
包名信息獲取模塊,其用于從每個包信息中獲取對應的已安裝的 應用程序的包名信息;
存儲模塊,其用于存儲所有已安裝的應用程序的包名信息,所述存儲模塊設于所述JAVA的內(nèi)存區(qū)域中;以及
判斷模塊,其用于判斷存儲模塊是否包含所需要判定的應用程序的包名信息,若是,則所需要判定的應用程序已經(jīng)安裝,若否,則所需要判定的應用程序未安裝。
本發(fā)明不局限于上述實施方式,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也視為本發(fā)明的保護范圍之內(nèi)。本說明書中未作詳細描述的內(nèi)容屬于本領域?qū)I(yè)技術人員公知的現(xiàn)有技術。