欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)實現(xiàn)根據(jù)包名判斷App運行狀態(tài)的方法

 更新時間:2017年11月16日 11:30:54   作者:cafeting  
這篇文章主要介紹了Android開發(fā)實現(xiàn)根據(jù)包名判斷App運行狀態(tài)的方法,結(jié)合實例形式分析了Android結(jié)合包名判斷app運行狀態(tài)的方法,需要的朋友可以參考下

本文實例講述了Android開發(fā)實現(xiàn)根據(jù)包名判斷App運行狀態(tài)的方法。分享給大家供大家參考,具體如下:

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

背景

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

① 沒有 Service

② 有 Service

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

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

注意:App 的 uid 對于系統(tǒng)內(nèi)置 App 而言不是唯一的,Android 內(nèi)置的應(yīng)用會有共用 uid 的情況。如果你是開發(fā)系統(tǒng)內(nèi)置應(yīng)用或者類似的東西,務(wù)必要自行進(jìn)行特殊方式檢查。

實現(xiàn)

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

/**
* 方法描述:判斷某一應(yīng)用是否正在運行
* Created by cafeting on 2017/2/4.
* @param context   上下文
* @param packageName 應(yīng)用的包名
* @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;
}
//獲取已安裝應(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 的程序是否有正在運行的進(jìn)程,即是否存活
* Created by cafeting on 2017/2/4.
*
* @param context   上下文
* @param uid 已安裝應(yīng)用的 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;
}

在正式使用的時候結(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){
    //指定包名的程序正在運行中
  }else{
    //指定包名的程序未在運行中
  }
}else{
  //應(yīng)用未安裝
}

總結(jié)

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

更多關(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è)計有所幫助。

相關(guān)文章

最新評論