国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android開發實現根據包名判斷App運行狀態的方法

2019-12-12 01:40:30
字體:
來源:轉載
供稿:網友

本文實例講述了Android開發實現根據包名判斷App運行狀態的方法。分享給大家供大家參考,具體如下:

前面講過Android開發判斷一個app應用是否在運行的方法,這里實現獲取指定包名的 APP 是否還在后臺運行,判斷 APP 是否存活。

背景

可以根據 App 是否有 Service 分兩類情況處理:

① 沒有 Service

② 有 Service

對于沒有 Service 的 App,程序一旦切換到后臺,可能很快就被回收了,這里使用 ActivityManager.getRunningTasks(int maxNum) 方法來獲取當前正在運行的任務,注意:此方法并不被系統推薦,且是一個 Deprecated 的方法。

對于有 Service 的 App,大多會有多個 Service ,且有可能都是 :remote 類型的,這樣在判斷上需要進行一定的處理,這里根據 App 的 uid 來判斷,避免在一些特殊的情況下判斷存活不準確的問題。我們使用 ActivityManager.getRunningServices(int maxNum) 方法獲取當前運行中的 Service 列表。

注意:App 的 uid 對于系統內置 App 而言不是唯一的,Android 內置的應用會有共用 uid 的情況。如果你是開發系統內置應用或者類似的東西,務必要自行進行特殊方式檢查。

實現

下面是幾個工具類,在正式使用的時候需要配合使用,才能覆蓋全部情況:

/*** 方法描述:判斷某一應用是否正在運行* 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{  //應用未安裝}

總結

在探索驗證程序存活的過程中,發現 ActivityManager.RunningServiceInfo 包含很多信息,一開始我是使用其 process started 屬性來判斷,其中 process 對應包名,但是對于只有 :remote 類型 service 時,則判定不了。

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荣昌县| 忻州市| 东宁县| 巧家县| 江都市| 静安区| 富源县| 鹤壁市| 塘沽区| 吴忠市| 安图县| 新民市| 通州区| 安多县| 洛浦县| 洛扎县| 商水县| 互助| 邯郸市| 凤庆县| 当阳市| 罗江县| 弥勒县| 新民市| 江源县| 武威市| 宣化县| 同心县| 揭东县| 墨脱县| 沾化县| 聂荣县| 宣恩县| 绍兴县| 慈利县| 冀州市| 道孚县| 嘉黎县| 赤城县| 黎川县| 石嘴山市|