Android 는 앱 프론트 데스크 톱 이 실행 되 는 지 백 스테이지 가 실행 되 는 지 판단 합 니 다(실행 상태)
이것 을 이해 하려 면 먼저 개념,app,process,task 를 알 아야 합 니 다.
1.process 는 프로 세 스 이 고 Liux 의 개념 입 니 다.
2.보통 하나의 app 은 하나의 uid 를 가지 고 하나의 프로 세 스 에서 실 행 됩 니 다.만약 에 app 에서 service 등에 서로 다른 uid 를 정의 하면 서 비 스 는 다른 프로 세 스 에서 실 행 됩 니 다.즉,uid 는 프로 세 스 의 id 와 같 고 하나의 uid 는 하나의 프로 세 스 를 대표 합 니 다.몇 개의 app 이 uid 를 정의 할 수도 있 습 니 다.그러면 그들 은 하나의 프로 세 스 에서 실 행 됩 니 다.
3.task 는 안 드 로 이 드 시스템 의 activity 스 택 으로 여러 app 의 activity 를 포함 하고 Activity Manager 를 통 해 스 택 에 있 는 activity 정 보 를 얻 을 수 있 으 며 activity 에 대응 하 는 상 태 를 판단 할 수 있 습 니 다.
3.1 할 수 있 는 일 은 다음 과 같다.
ActivityManagermActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
PackageManagermPackageManager = context.getPackageManager();
① getRecentTasks()는 최근 에 열 린 task 를 가 져 옵 니 다.핸드폰 으로 최근 에 열 린 애플 리 케 이 션 을 보면 이 를 사용 할 수 있 습 니 다.② getRunning AppProcess()는 app 이 실행 중인 process 를 가 져 옵 니 다.
List list = mActivityManager.getRunningAppProcesses();
StringBuilder apps = new StringBuilder();
for (RunningAppProcessInfo info : list) {
apps.append(info.processName + "
" + info.importance);
}
System.out.println(apps.toString());
list 는 시스템 이 현재 실행 중인 프로 세 스 의 집합 입 니 다.importance 속성==100 은 이 프로 세 스 가 프론트 에 있 고 다른 숫자 는 백 엔 드 에 있 음 을 표시 하기 때문에 importance 와 processName 을 통 해 응용 프로그램 이 프론트 에 있 는 지 여 부 를 판단 합 니 다.
내 가 테스트 를 할 때 방법 이 되 돌아 오 는 list 에는 이 프로 세 스 만 있 었 다.프론트 데스크 는 상태 가 100 이 고 백 스테이지 상 태 는 400 이 었 다.
이것 은 제 핸드폰 이 5.0 이상 이기 때 문 입 니 다.api 21 부터 이 방법 은 자신의 응용 프로 세 스 정 보 를 되 돌려 줄 수 밖 에 없습니다.만약 에 응용 프로그램 에 Service 가 있 고 process 속성 을 정의 하면 두 프로 세 스 를 되 돌려 줍 니 다.app 프로 세 스 는 100 이 고 Service 는 다른 값 입 니 다.5.0 이하 에 서 는 모든 것 을 되 돌 릴 수 있 고,다른 방법 은 5.0 이상 에 서 는 모든 것 을 되 돌 릴 수 있 으 며,5.0 이하 에 서 는 안 된다 고 뒤에 말한다.
*또한,어떤 app 의 Service 가 점성 으로 설정 되 었 을 때 Service 가 있 는 app 은 프론트 데스크 에 있 는 것 으로 여 겨 집 니 다.app 프로 세 스 의 importance 는 100 이 므 로 이 방법 을 통 해 프론트 데스크 에 있 는 지 여 부 를 판단 할 수 없습니다.
요약:5.0 이상 은 자신의 응용 이 프론트 데스크 톱 에 있 는 지 판단 할 수 있 을 뿐 app 이 있 는 Service 가 점성 으로 설정 되 었 을 때 사용 할 수 없습니다.
If(importance == 100) 100 runningprocessinfo IMPORTANCE_FOREGROUND
그래서 여 기 는 if(info.importance==Running ProcessInfo.IMPORTANCEFOREGROUND)③ getRunning Services()는 시스템 이 실행 중인 배경 서 비 스 를 가 져 옵 니 다.
④ getRunning Task()는 시스템 이 실행 중인 작업 을 가 져 옵 니 다.
위 에서 activity 의 task 스 택 을 말 했 습 니 다.스 택 의 activity 가 있 는 app 은 바로 프론트 데스크 의 app 입 니 다.스 택 의 activity 정 보 를 받 아 그의 가방 이름 을 얻 고 응용 프로그램의 가방 이름 을 비교 하여 응용 이 프론트 데스크 에 있 는 지 판단 할 수 있 습 니 다.5.0 이전에 어떤 응용 이 프론트 데스크 에 있 는 지 판단 할 수 있 습 니 다.5.0 이후 에 자신 과 부분 만 돌아 갈 수 있 습 니 다.다른 응용 이 프론트 데스크 에 있 는 지 판단 할 수 없습니다.자신 을 판단 할 수 밖 에 없다.
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (topActivity.getPackageName().equals(context.getPackageName())) {
“ ”
}
}
백 스테이지4.ActivityLifecycleCallbacks
이전에 모든 activity 를 baseactivity 로 통합 하여 onCreate 방법,onStop 방법 을 다시 쓰 고 변수 count 통계 로 열 린 activity 수 를 정의 한 적 이 있 습 니 다.onCreate 시 count+,onStop 시 count-,count==0 시 응용 은 배경 에 있 습 니 다.현재 api 14 부터 api 는 모든 activity 생명주기 의 리 셋 을 제공 합 니 다.바로 Activity LifecycleCallbacks 입 니 다.모든 activity 의 생명주기 가 실 행 됩 니 다.register Activity LifecycleCallbacks 를 통 해 이 리 셋 을 등록 합 니 다.
사실 baseactivity 를 다시 쓰 는 onCreate 와 onStop 과 같은 것 입 니 다.리 셋 된 onCreate 에서 count+,onStop 에서 count--,onStop 에서 판단 을 추가 합 니 다.if(count==0){"배경 에 있 습 니 다"},왜 onStop 에 있 습 니까?back 이 돌아 오 든 홈 이 종료 되 든 다른 수단 이 종료 되 든 activity 는 onStop 으로 돌아 갑 니 다.
온 스 톱 에서 getRunning AppProcess 나 getRunning Task 를 직접 호출 하여 응용 프로그램 이 백 스테이지 로 달 려 갔 는 지 판단 할 수 있 습 니 다.이 럴 때 뭔 가 를 할 수 있 습 니 다.그리고 백 스테이지 에서 프론트 데스크 로 돌아 가 onCreate 를 호출 하면 또 뭔 가 를 할 수 있 습 니 다.
내 가 했 던 이 건 앱 이 프론트 에 나 갈 때마다 새로운 버 전이 업데이트 되 었 는 지 확인 하 는 거 야.사용자 정의 응용 프로그램의 onCreate 에 이 리 셋 을 등록 합 니 다.
5.UsageStatsManager,이것 이 바로 위 에서 말 한 5.0 이후 에 야 유효한 방법 입 니 다.사용 하려 면 가입 권한 이 필요 합 니 다.
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" xmlns:tools="http://schemas.android.com/tools"></uses-permission>
핸드폰-설정-안전-고급,사용 상황 을 볼 수 있 는 앱 에서 자신의 앱 을 선택 합 니 다.6.안 드 로 이 드 자체 의 무장 애 기능 을 통 해
http://effmx.com/articles/tong-guo-android-fu-zhu-gong-neng-accessibility-service-jian-ce-ren-yi-qian-tai-jie-mian/
7.Linux 커 널 이/proc 디 렉 터 리 에 보 호 된 process 프로 세 스 정보,GitHub 주소 읽 기https://github.com/jaredrummler/AndroidProcesses
권한 이 필요 하지 않 습 니 다.프론트 데스크 톱 에 있 는 지 여 부 를 판단 할 수 있 지만 폴 더 를 검색 하 는 데 는 시간 이 필요 합 니 다.
사용법
실행 중인 App 프로 세 스 가 져 오기
List processes = ProcessManager.getRunningAppProcesses();</androidappprocess>
실행 중인 App 프로 세 스 에 대한 자세 한 정 보 를 가 져 옵 니 다.
AndroidAppProcess process = processes.get(location);
String processName = process.name;
Stat stat = process.stat();
int pid = stat.getPid();
int parentProcessId = stat.ppid();
long startTime = stat.stime();
int policy = stat.policy();
char state = stat.state();
Statm statm = process.statm();
long totalSizeOfProcess = statm.getSize();
long residentSetSize = statm.getResidentSetSize();
PackageInfo packageInfo = process.getPackageInfo(context, 0);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
프론트 에 있 는 지 아 닌 지 를 판단 하 다.
if (ProcessManager.isMyProcessInTheForeground()) {
// do stuff
}
실행 중인 App 프로 세 스 에 대한 자세 한 정보 가 져 오기
List processes = ProcessManager.getRunningAppProcessInfo(ctx);</activitymanager.runningappprocessinfo>
이상 의 내용 은 안 드 로 이 드 를 대상 으로 app 상 태 를 판단 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.