您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android中怎么根據(jù)包名判斷App運行狀態(tài),文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
背景
可以根據(jù) App 是否有 Service 分兩類情況處理:
① 沒有 Service
② 有 Service
對于沒有 Service 的 App,程序一旦切換到后臺,可能很快就被回收了,這里使用 ActivityManager.getRunningTasks(int maxNum)
方法來獲取當前正在運行的任務,注意:此方法并不被系統(tǒng)推薦,且是一個 Deprecated 的方法。
對于有 Service 的 App,大多會有多個 Service ,且有可能都是 :remote 類型的,這樣在判斷上需要進行一定的處理,這里根據(jù) App 的 uid 來判斷,避免在一些特殊的情況下判斷存活不準確的問題。我們使用 ActivityManager.getRunningServices(int maxNum)
方法獲取當前運行中的 Service 列表。
注意:App 的 uid 對于系統(tǒng)內置 App 而言不是唯一的,Android 內置的應用會有共用 uid 的情況。如果你是開發(fā)系統(tǒng)內置應用或者類似的東西,務必要自行進行特殊方式檢查。
實現(xiàn)
下面是幾個工具類,在正式使用的時候需要配合使用,才能覆蓋全部情況:
/** * 方法描述:判斷某一應用是否正在運行 * Created by cafeting on 2017/2/4. * @param context 上下文 * @param packageName 應用的包名 * @return true 表示正在運行,false 表示沒有運行 */ 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; } //獲取已安裝應用的 uid,-1 表示未安裝此應用或程序異常 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 的程序是否有正在運行的進程,即是否存活 * Created by cafeting on 2017/2/4. * * @param context 上下文 * @param uid 已安裝應用的 uid * @return true 表示正在運行,false 表示沒有運行 */ 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; }
在正式使用的時候結合兩者即可:
String pName = "xxx"; int uid = getPackageUid(context, pName); if(uid > 0){ boolean rstA = isAppRunning(context, pName); boolean rstB = isProcessRunning(context, uid); if(rstA||rstB){ //指定包名的程序正在運行中 }else{ //指定包名的程序未在運行中 } }else{ //應用未安裝 }
關于Android中怎么根據(jù)包名判斷App運行狀態(tài)就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。