마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 최상위화면 정상적으로 확인안되는 문제.

0 추천

안녕하세요, 안드로이드 초보 개발자입니다.

최상위화면을 주기적(0.1초)으로 확인하는 쓰레드를 돌리고 있습니다. (앱동작중일경우)

그래서 최상위화면으로 특정화면이 올라오면 감지하는건데요

다음과 같은 코드를 사용합니다.

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> Info = am.getRunningTasks(1);
ComponentName topActivity = Info.get(0).topActivity;
String topactivityname = topActivity.getClassName();
 
원래 잘되는데... 특정단말에서 갑자기 안되네요 ㅠ 매번 안되는건 아니고 가끔안됩니다...
 
제가 A화면을 감지하고 있다고 치면요
다른화면을 보다가 A화면으로 오면 바로 감지가 되어야 하는데
쓰레드에서 찍는 로그를 보면 약 5초동안 이전화면이 최상위인걸로 감지가 됩니다.
 
그래서 혹시나 싶어서 adb로 확인을 해봤더니... adb는 즉각적으로 A화면이 찍히네요
(adb shell "dumpsys window|grep mCurrentFocus")
 
무엇이 문제인지 갈피를 잡을수가 없습니다 ㅠ
 
혹시 이에대해 아시는분 조언 부탁드립니다.
 

 

블랙이요블랙 (12,860 포인트) 님이 2015년 5월 6일 질문
루팅으로 get_task 권한은 정상동작하고 있구요
안드로이드 5.0 단말입니다.

1개의 답변

0 추천

http://stackoverflow.com/questions/3873659/android-how-can-i-get-the-current-foreground-activity-from-a-service

위 링크에서 아래 제목으로 시작되는 세번째 답변을 참고하시기 바랍니다.

Use an AccessibilityService

대강 정리하면 getRunningTask 는 API Level 21 (Lollipop) 에서 deprecated 되었습니다.

주기적으로 체크할 필요가 없습니다.

get_task 퍼미션이 필요 없습니다.

예제도 잘 나와있군요

 

현재코드에서 크게 변화를 주지 않으면서 처리하기에는 그 아래 쪽 답변도 괜찮아 보이네요

Use ActivityManager

롤리팝 이전버전과 이후 버전을 체크해서 다른 방법으로 가져오도록 처리하고 있습니다.

이 역시 예제도 잘 나와있습니다.

Gradler (109,780 포인트) 님이 2015년 5월 6일 답변
Gradler님이 2015년 5월 6일 수정
답변 감사합니다.
근데 2개다 사용못하겠네요 ㅠ
접근성방법으로 하게될경우, 사용자로하여금 접근성허용을 받아야하는데.. 이런 사항은 갑이 허용하지 않습니다.
두번째 방법은 액티비티가 아닌 프로세스명을 주더라구요
같은 프로세스에 여러개의 액티비티명이 있을수 있기때문에..이것도 사용이 불가능하네요
(예를들어 연락처와 통화화면은 같은 프로세스입니다.)

다시한번 답변 감사드립니다.
둘 다 사용못한다고 한다면 위 이슈는 어쩔 수 없을 듯 하네여
메소드가 자체가 deprecated 되었으니..
...