android中判斷服務或者進程是否存在

1.判斷進程是否存在

    /**
     * 判斷是否在主進程,這個方法判斷進程名或者pid都可以,如果進程名一樣那pid肯定也一樣
     *
     * @return true:當前進程是主進程 false:當前進程不是主進程
     */
    public boolean isUIProcess() {
        ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
        List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
        String mainProcessName = getPackageName();
        int myPid = android.os.Process.myPid();
        for (ActivityManager.RunningAppProcessInfo info : processInfos) {
            if (info.pid == myPid && mainProcessName.equals(info.processName)) {
                return true;
            }
        }
        return false;
    }

2.判斷服務是否存在

    /**
     * 判斷service是否已經運行
     * 必須判斷uid,因為可能有重名的Service,所以要找自己程序的Service,不同進程只要是同一個程序就是同一個uid,個人理解android系統中一個程序就是一個用戶
     * 用pid替換uid進行判斷強烈不建議,因為如果是遠程Service的話,主進程的pid和遠程Service的pid不是一個值,在主進程調用該方法會導致Service即使已經運行也會認為沒有運行
     * 如果Service和主進程是一個進程的話,用pid不會出錯,但是這種方法強烈不建議,如果你后來把Service改成了遠程Service,這時候判斷就出錯了
     *
     * @param className Service的全名,例如PushService.class.getName()
     * @return true:Service已運行 false:Service未運行
     */
    public boolean isServiceExisted(String className) {
        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> serviceList = am.getRunningServices(Integer.MAX_VALUE);
        int myUid = android.os.Process.myUid();
        for (ActivityManager.RunningServiceInfo runningServiceInfo : serviceList) {
            if (runningServiceInfo.uid == myUid && runningServiceInfo.service.getClassName().equals(className)) {
                return true;
            }
        }
        return false;
    }

注意:

上面判斷Service是否存在,用的uid和Service的類全名,網上我查到的資料,全部是用的pid,在Service和主進程是一個進程的時候,pid沒有問題,但是如果Service是遠程Service,和主進程就不是一個進程了,這時候用pid和Service的類全名進行判斷就會判斷錯誤

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容