Android--获取前台当前APP

       使用usage statistics API,这个API本来是系统用来统计app使用情况的,包含了每个app最近一次被使用的时间。我们只需要找出距离现在时间最短的那个app,就是当前在前台的app。

类和方法

方法 说明
UsageStaticsManager app使用统计的管理者
queryUsageStats (int intervalType, long beginTime, long endTime) 按照条件查询,结果是List,API>=21
UsageStats app使用统计信息类
getPackageName() 获取包名,API>=21
getLastTimeUsed()

最后的使用时间,API>=21

首先需要在AndroidManifest里声明权限:

如果不声明权限,会导致打开的设置界面没有我们的应用。打开手机设置,点击安全-高级,在有权查看使用情况的应用中,为这个App打上勾。

实现方法:

/**
     * 判断手机当前前台显示的APP
     * @param context
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private String getForegroundApp(Context context) {
        /**
         * 此功能需要在设置的(允许查看使用情况的应用)里打开,在很多手机设置里没有发现这一入口。
         需要在代码里打开,注意要判断一下系统版本
         */
//        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
//            startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
//        }
        boolean isInit = true;
        UsageStatsManager usageStatsManager =
                (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        long ts = System.currentTimeMillis();
        List queryUsageStats =
                usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, ts);
        UsageEvents usageEvents = usageStatsManager.queryEvents(isInit ? 0 : ts-5000, ts);
        if (usageEvents == null) {
            return null;
        }

        UsageEvents.Event event = new UsageEvents.Event();
        UsageEvents.Event lastEvent = null;
        while (usageEvents.getNextEvent(event)) {
            // if from notification bar, class name will be null
            if (event.getPackageName() == null || event.getClassName() == null) {
                continue;
            }

            if (lastEvent == null || lastEvent.getTimeStamp() < event.getTimeStamp()) {
                lastEvent = event;
            }
        }

        if (lastEvent == null) {
            return null;
        }
        return lastEvent.getPackageName();
    }

 

你可能感兴趣的:(Android,Android开发)