안드로이드 5(롤리팝) 이후부터는 안드로이드 기기에 실행중인 앱을 알 수 없게 되었습니다. 그래서, 안드로이드 5 이후 버전에서는 기기에 저장하고 있는 통계 데이터를 기반으로 완전히 정확하지는 않지만, 대략적으로 정확한 정보를 가져올 수 있습니다. UsageStatsManager를 사용해서 현재 안드로이드 기기의 화면에 실행중인 앱을 검색하는 방법을 살펴보자.
아래는 UsageStatsManager를 사용해서 안드로이드 기기에 저장되어 있는 이벤트 데이터를 검색하고, 이벤트가 포그라운드(Event.MOVE_TO_FOREGROUND 또는 Event.ACTIVITY_RESUMED)인 것을 확인해서 마지막 포그라운드 이벤트에 해당하는 패키지 이름을 가져온다. 이 정보는 대체로 정확하고, 아래 코드로 가져온 패키지가 현재 화면에서 실행중인 것을 확인 할 수 있다.
1. 앱의 AndroidManifest.xml에 아래의 권한을 추가
2. 안드로이드 기기에서 실행중인 앱 가져오기
public static String getTopPackageName(@NonNull Context context) { UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); long lastRunAppTimeStamp = 0L; final long INTERVAL = 1000 * 60 * 5; final long end = System.currentTimeMillis(); // 1 minute ago final long begin = end - INTERVAL; LongSparseArray packageNameMap = new LongSparseArray<>(); final UsageEvents usageEvents = usageStatsManager.queryEvents(begin, end); while (usageEvents.hasNextEvent()) { UsageEvents.Event event = new UsageEvents.Event(); usageEvents.getNextEvent(event); if(isForeGroundEvent(event)) { packageNameMap.put(event.getTimeStamp(), event.getPackageName()); if(event.getTimeStamp() > lastRunAppTimeStamp) { lastRunAppTimeStamp = event.getTimeStamp(); } } } return packageNameMap.get(lastRunAppTimeStamp, ""); }
3. 이벤트가 포그라운드 이벤트인지 확인
private static boolean isForeGroundEvent(UsageEvents.Event event) { if(event == null) { return false; } if(BuildConfig.VERSION_CODE >= 29) { return event.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED; } return event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND; }
위 코드를 사용해서 완전히 정확하지는 않지만, 대체로 정확하게 안드로이드 화면에서 실행중인 앱을 알 수 있다.