Android開發(fā)實(shí)現(xiàn)根據(jù)包名判斷App運(yùn)行狀態(tài)的方法
本文實(shí)例講述了Android開發(fā)實(shí)現(xiàn)根據(jù)包名判斷App運(yùn)行狀態(tài)的方法。分享給大家供大家參考,具體如下:
前面講過Android開發(fā)判斷一個(gè)app應(yīng)用是否在運(yùn)行的方法,這里實(shí)現(xiàn)獲取指定包名的 APP 是否還在后臺運(yùn)行,判斷 APP 是否存活。
背景
可以根據(jù) App 是否有 Service 分兩類情況處理:
① 沒有 Service
② 有 Service
對于沒有 Service 的 App,程序一旦切換到后臺,可能很快就被回收了,這里使用 ActivityManager.getRunningTasks(int maxNum)
方法來獲取當(dāng)前正在運(yùn)行的任務(wù),注意:此方法并不被系統(tǒng)推薦,且是一個(gè) Deprecated 的方法。
對于有 Service 的 App,大多會(huì)有多個(gè) Service ,且有可能都是 :remote 類型的,這樣在判斷上需要進(jìn)行一定的處理,這里根據(jù) App 的 uid 來判斷,避免在一些特殊的情況下判斷存活不準(zhǔn)確的問題。我們使用 ActivityManager.getRunningServices(int maxNum)
方法獲取當(dāng)前運(yùn)行中的 Service 列表。
注意:App 的 uid 對于系統(tǒng)內(nèi)置 App 而言不是唯一的,Android 內(nèi)置的應(yīng)用會(huì)有共用 uid 的情況。如果你是開發(fā)系統(tǒng)內(nèi)置應(yīng)用或者類似的東西,務(wù)必要自行進(jìn)行特殊方式檢查。
實(shí)現(xiàn)
下面是幾個(gè)工具類,在正式使用的時(shí)候需要配合使用,才能覆蓋全部情況:
/** * 方法描述:判斷某一應(yīng)用是否正在運(yùn)行 * Created by cafeting on 2017/2/4. * @param context 上下文 * @param packageName 應(yīng)用的包名 * @return true 表示正在運(yùn)行,false 表示沒有運(yùn)行 */ public static boolean isAppRunning(Context context, String packageName) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100); if (list.size() <= 0) { return false; } for (ActivityManager.RunningTaskInfo info : list) { if (info.baseActivity.getPackageName().equals(packageName)) { return true; } } return false; } //獲取已安裝應(yīng)用的 uid,-1 表示未安裝此應(yīng)用或程序異常 public static int getPackageUid(Context context, String packageName) { try { ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(packageName, 0); if (applicationInfo != null) { Logger.d(applicationInfo.uid); return applicationInfo.uid; } } catch (Exception e) { return -1; } return -1; } /** * 判斷某一 uid 的程序是否有正在運(yùn)行的進(jìn)程,即是否存活 * Created by cafeting on 2017/2/4. * * @param context 上下文 * @param uid 已安裝應(yīng)用的 uid * @return true 表示正在運(yùn)行,false 表示沒有運(yùn)行 */ public static boolean isProcessRunning(Context context, int uid) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices(200); if (runningServiceInfos.size() > 0) { for (ActivityManager.RunningServiceInfo appProcess : runningServiceInfos){ if (uid == appProcess.uid) { return true; } } } return false; }
在正式使用的時(shí)候結(jié)合兩者即可:
String pName = "xxx"; int uid = getPackageUid(context, pName); if(uid > 0){ boolean rstA = isAppRunning(context, pName); boolean rstB = isProcessRunning(context, uid); if(rstA||rstB){ //指定包名的程序正在運(yùn)行中 }else{ //指定包名的程序未在運(yùn)行中 } }else{ //應(yīng)用未安裝 }
總結(jié)
在探索驗(yàn)證程序存活的過程中,發(fā)現(xiàn) ActivityManager.RunningServiceInfo
包含很多信息,一開始我是使用其 process 和 started 屬性來判斷,其中 process 對應(yīng)包名,但是對于只有 :remote 類型 service 時(shí),則判定不了。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- Android 刪除指定包名的App實(shí)例代碼
- Android獲取應(yīng)用程序名稱(ApplicationName)示例
- Android ApplicationInfo 應(yīng)用程序信息的詳解
- android 獲取本機(jī)其他app的版本信息的示例代碼
- Android獲取手機(jī)型號/系統(tǒng)版本號/App版本號等信息實(shí)例講解
- android app icon 圖標(biāo)大小尺寸
- Android如何動(dòng)態(tài)改變App桌面圖標(biāo)
- Android App更改應(yīng)用的圖標(biāo)的實(shí)現(xiàn)方法
- Android編程獲取APP應(yīng)用程序基本信息輔助類【APP名稱、包名、圖標(biāo),版本號等】
相關(guān)文章
Android自定義ScrollView實(shí)現(xiàn)阻尼回彈
這篇文章主要為大家詳細(xì)介紹了Android自定義ScrollView實(shí)現(xiàn)阻尼回彈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android之用PopupWindow實(shí)現(xiàn)彈出菜單的方法詳解
本篇文章是對在Android中,用PopupWindow實(shí)現(xiàn)彈出菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06[Alibaba-ARouter]淺談簡單好用的Android頁面路由框架
這篇文章主要介紹了[Alibaba-ARouter]淺談簡單好用的Android頁面路由框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android開發(fā)中調(diào)用系統(tǒng)相冊上傳圖片到服務(wù)器OPPO等部分手機(jī)上出現(xiàn)短暫的顯示桌面問題的解決方法
這篇文章主要介紹了Android開發(fā)中調(diào)用系統(tǒng)相冊上傳圖片到服務(wù)器OPPO等部分手機(jī)上出現(xiàn)短暫的顯示桌面問題的解決方法,需要的朋友可以參考下2016-12-12Android應(yīng)用開發(fā)中Fragment的靜態(tài)加載與動(dòng)態(tài)加載實(shí)例
這篇文章主要介紹了Android應(yīng)用開發(fā)中Fragment的靜態(tài)加載與動(dòng)態(tài)加載實(shí)例,例子中包括動(dòng)態(tài)的添加更新以及刪除Fragment等操作,很有借鑒意義,需要的朋友可以參考下2016-02-02