在前段時間,公司要求作一個Android系統的應用程序管理,要實現卸載程序、清除數據、中止正在運行的服務這幾大模塊,如今將代碼粗略總結以下:java
主要運用到的類有android
PackageManager數據庫
ActivityManager緩存
ApplicationInfo服務器
RunningServiceInfo數據結構
Methodapp
還有兩個android.pm下的源文件用於生成樁,IPackageStatsObserver.java 和 IPackageDataObserver.java,由名字能夠看出,他們是跟包的狀態和大小有關的,在網上找到這兩個文件的源碼後,把他們放在工程src目錄下的android.pm包下,本身建包。框架
首先要得到系統中已經裝了的apk,apk分爲兩類第一是系統的apk,第二是第三方的apk,因此在獲取apk時能夠指定一個過濾器,見以下代碼:ide
AppInfo是我本身定義的一個類,裏面包含了應用程序的包名、數據區大小、代碼區大小、等等一些屬性。函數
好,如今咱們來獲取app包的數據區大小、緩存區大小、代碼區大小,這裏要用反射的機制去獲取PackageManager類的隱藏方法getPackageSizeInfo(),這個方法的具體實現是經過回調函數來實現的,這裏要用到IPackageStatsObserver這個類生成的樁。
或獲得app的大小數據後,封裝成消息發送出去,這是最好的方法!!
這裏也介紹一個將long型數據轉換成文件大小格式的數據。
好,如今咱們來清除用戶數據,這裏要用到以前下載的那個文件IPackageDataObserver,跟獲取app大小同樣的,經過回調來實現。
好,如今到卸載程序的時候了,看代碼
關於apk的管理就差很少了,如今來看看正在運行的服務的管理
首先,獲取正在運行的服務:
這裏個人RunningInfo是我本身定義的一個類,主要服務的一些屬性,好比包名、uid、pid等等那些
好,獲取到了正在運行的服務以後,就能夠隨意中止服務了,中止服務的代碼是:
一樣也是用反射的機制來獲得隱藏類。
到這裏,應用程序管理的功能就差很少了,剩下就只是界面上的事情和程序的處理流程上的事情,應該還好!
原文:http://www.ophonesdn.com/article/show/20
07年,Google公司推出了基於Java語言的Android平臺,引發了IT業界的一致關注,同年,播思通信公司開始研發基於其的OPhone平臺。
08年,第一款Android手機G1面世,這款Google爲HTC量身打造的滑蓋手機由T Mobile發行,得到了用戶的極大好評,也爲整個Android平臺的正式商用做出了榜樣。
09年,將是OPhone/Android手機的第一個井噴年,播思通信聯合中國移動和各個手機廠商即將推出多款觸屏手機。同時,Android社區也日趨壯大,已擁有各類應用五百多個,並在快速增加之中。
本文將對Android應用結構及Android系統的應用管理加以介紹。
本文面對的讀者是對Android應用的研發人員、或有過Android開發經驗的入門者。
理解什麼是Android應用是Android入門所必須的,也是瞭解應用管理的前提。
那什麼是Android應用呢?即指基於Android開發,編譯,運行在Android平臺的應用。這種應用在編譯階段被打成一個jar包,以.apk結尾,包內包含了全部運行階段須要的代碼與資源,其中主要分爲三塊:描述文件AndroidManifest.xml、代碼段和運行時資源。
AndroidManifest.xml是Android應用的描述文件,它描述了該應用的相關信息,主要包括如下各個元素。
指定本應用內java主程序包的包名。當沒有指定apk的文件名時,編譯後產生程序包將以此命名。本包名應當在Android系統運行時惟一。
指定本應用程序所授予的信任級別,目前有的認證級別有platform(system)、shared、media以及應用自定義的認證。不一樣的認證能夠享受不一樣的權限。
權限組的定義是爲了描述一組具備共同特性的權限。Android系統中預訂了一些組,它們是:
從字面意思咱們就能夠理解每一個組的特性。具體含義能夠參考SDK文檔。
權限用來描述是否擁有作某件事的權力。Android系統中權限是分級的,前分爲普通級別(Normal),危險級別(dangerous),簽名級別(signature)和系統/簽名級別(signature or system)。
系統中全部預約義的權限根據做用的不一樣,分別屬於不一樣的級別。
對於普通和危險級別的權限,咱們稱之爲低級權限,應用申請即授予。其餘兩級權限,咱們稱之爲高級權限或系統權限,應用擁有platform級別的認證才能申請。
當應用試圖在沒有權限的狀況下作受限操做,應用將被系統殺掉以警示。
系統應用可使用任何權限。權限的聲明者可無條件使用該權限。
目前Android系統定義了許多權限,經過SDK文檔用戶能夠查詢到哪些操做須要哪些權限,而後按需申請。
權限樹的設置是爲了統一管理一組權限,聲明於該樹下的權限全部者歸屬該應用。系統提供了API,應用能夠在運行時動態添加。
PackageManager.addPermission()
應用須要的權限應當在此處申請,所申請的權限應當被系統或某個應用所定義,不然視爲無效申請。
同時,使用權限的申請須要遵循權限授予條件,非platform認證的應用沒法申請高級權限。
標識本應用運行的SDK版本。高兼容性的應用能夠忽略此項。
application是Android應用內最高級別(top level)的模塊,每一個應用內最多隻能有一個application,若是應用沒有指定該模塊,一個默認的application將被啓用。
application將在應用啓動時最早被加載,並存活在應用的整個運行時生命週期。所以一些初始化的工做適合在本模塊完成。
Application元素有許多屬性,其中:「persistent」表示本應用是否爲常駐內存,「enable」表示本應用當前是否應當被加載。
其它相關屬性請參考SDK文檔,開發者能夠根據須要添加。
在AndroidManifest.xml文件中,運行時模塊的定義都做爲本模塊的子元素。
當運行時模塊被調度時,若是應用沒有啓動,將首先啓動應用進行初始化,而後調度對應模塊。
activity是application模塊的運行時子元素,標識了一個UI。除了application,一個應用能夠聲明並實現零至多個其它運行時模塊,activity也一樣。
activity也包含了許多定義它工做狀態的屬性,其中:「name」是必須的,它指定了該activity所在的文件名,若是該文件所屬包不一樣於該應用的包名(即本描述文件的最開始處),那麼名字前面須要加入所在包名。
activity經過增長intent-fliter來標識哪些intent能夠被處理,同時intent也是調度activity的主要參數。
做爲一個運行時的對象,activity的調度方式大體分爲兩種:一種是指定activit所在類名直接調度,另外一種是利用activity能夠處理的intent進行調度。
同一種intent能夠被不一樣應用的不一樣activity處理。當出現此種狀況時,用戶須要選擇具體的activity。
receiver也是application的運行時子元素。
receiver經過增長intent-fliter來標識它須要接受哪些intent。當收到intent後,receiver將根據不一樣的intent進行不一樣的處理。
當一個Intent發出後,全部註冊了該intent的receiver都將會收到,系統會根據receiver在系統中的註冊次序順序發送。當一個receiver處理完該Intent後,系統纔會向下一個receiver發送。
當一個receiver有多個未接收的intent時,將按照intent發送的次序順序接收。
service也是application的運行時子元素。Service屬於後臺模塊,啓動後將長時間運行,除非中止該service或所在應用進程被殺死。
service從功能上分爲兩種,一種是服務於本應用,此時的service是一個普通的運行時模塊,另外一種是服務於全部應用或對應應用,此時須要定義API並將之公佈來與其它應用進行交互。
service須要經過API:startService()添加到service管理器中,添加後即在後臺運行。它接受外界信息的方式分兩種:一種是增長IntentFilter來接收intent,一種是外界應用調用該service所定義的API。
provider也是application的運行時子元素。它繼承於ContentProvider,是對該應用管理的用戶數據的結構化接入,是基於數據庫操做方式的封裝。
若是應用容許外部應用訪問/管理它的用戶數據,provider是Android平臺提供的最佳方式。
顧名思義,是已有activity的別名。
標識應用啓動所必須的共享庫。
應用全部的java文件被放入一個包結構,該包命名爲classes.dex。
Android應用運行時所需的各類資源有layout,drawable,string,style等類型。編譯後全部資源統一存放在項目路徑/res裏,按照用途的不一樣存放在各個子文件夾中。
編譯階段,全部resource將被排序,每一個resource在程序包中都擁有惟一的標識,同時一個名爲resources.arsc的文件生成並被置入安裝包中,該文件包含了全部索引以供運行時快速查詢。而resource以一樣目錄結構組織放入安裝包中。
應用管理是對系統中全部應用整個生命週期的管理。Android系統中,應用都是以.apk文件的形式存在,所以應用管理也能夠簡單理解爲對.apk文件的管理。
從一個應用在系統中的生命週期來看,應用管理能夠分爲安裝,卸載和使用等部分。
Android系統中,安裝應用時不能指定安裝目錄,全部的應用都只能裝在預置文件夾下。
Android系統支持數種安裝方式,而播思通信的Ophone平臺在此基礎上支持更多方式。
Android系統中,應用安裝包.apk文件屬於默認支持的文件類型,它的的mime type被定義爲"application/vnd.android.package-archive"。
系統內置了安裝工具來解析並安裝.apk文件。你能夠從OPhone平臺的文件管理器中找到對應安裝包,點擊便可啓動安裝步驟。這裏給出了相應的代碼,有興趣的開發者能夠嘗試使用。
Android系統提供了安裝應用的API:PackageManager.installPackage(final Uri packageURI,
final IPackageInstallObserver observer, final int flags);
由OPhone平臺擴展,標識該應用安裝目錄爲存儲卡,默認爲data分區。
由於手機中data分區大小有限,所以OPhone平臺默認將應用裝到存儲卡上。
本API須要"android.permission.INSTALL_PACKAGES"權限,該權限屬於簽名級別,所以只有系統級別的應用程序才能使用。
Android支持拷貝即安裝的方式,即將安裝包拷貝到預置安裝目錄便可自動安裝,但全部的預置目錄對於用戶不可見。
OPhone平臺擴展後,用戶可將安裝包拷入存儲卡的app目錄下,系統將監控該文件夾,檢測到新的安裝文件後自動安裝。
這種方式適合一次安裝大量應用,可是也有壞處。一是沒法知道哪些應用安裝成功,哪些安裝失敗, 二是安裝失敗的應用將會做爲垃圾存放在預置目錄中,在系統啓動時延長啓動時間,三是過多的應用可能將data分區的空間佔用過多,影響系統的正常使用。