Android判斷當前棧頂Activity的包名

KevinMoJ發表於2017-04-28

本人第一次寫部落格,目的就是為了記錄自己的一步步成長,肯定有想的不周到的地方,希望大家批評指教~~

有時候,我們想做一個功能需求的時候,在網上找相關資料,總是找不到想要的,所以我就想到了用部落格來記錄和整理自己發現的新東西,話不多說,直接擼程式碼~

    //判斷當前是不是桌面
    public static boolean isHome(Context context) {
        String topPackageName = getTopActivityName(context);
        //此處做了判斷如果得到的是null的話就返回一個true
        return topPackageName == null ? true : getHomesPackageName(context).contains(topPackageName);
    }

    //得到桌面的包名,包括第三方桌面
    private static List<String> getHomesPackageName(Context context) {
        List<String> homePackageNames = new ArrayList<>();
        PackageManager packageManager = context.getPackageManager();
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo info : resolveInfo) {
            homePackageNames.add(info.activityInfo.packageName);
        }
        return homePackageNames;
    }

    //得到棧頂Activity的名字,注意此處要進行判斷,Android在5.0以後Google把getRunningTasks的方法給遮蔽掉了,所以要分開處理
    private static String getTopActivityName(Context context) {
        String topActivityPackageName;
        ActivityManager manager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //此處要判斷使用者的安全許可權有沒有開啟,如果開啟了就進行獲取棧頂Activity的名字的方法
            //當然,我們的要求是如果沒開啟就不獲取了,要不然跳轉會影響使用者的體驗
            if (isSecurityPermissionOpen(context)) {
                UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
                long endTime = System.currentTimeMillis();
                long beginTime = endTime - 1000 * 60 * 2;
                UsageStats recentStats = null;

                List<UsageStats> queryUsageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, endTime);
                if (queryUsageStats == null || queryUsageStats.isEmpty()) {
                    return null;
                }

                for (UsageStats usageStats : queryUsageStats) {
                    if (recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()) {
                        recentStats = usageStats;
                    }
                }
                topActivityPackageName = recentStats.getPackageName();
                return topActivityPackageName;
            } else {
                return null;
            }
        } else {
            List<ActivityManager.RunningTaskInfo> taskInfos = manager.getRunningTasks(1);
            if (taskInfos.size() > 0)
                topActivityPackageName = taskInfos.get(0).topActivity.getPackageName();
            else
                return null;
            return topActivityPackageName;
        }
    }

    //判斷使用者對應的安全許可權有沒有開啟
    private static boolean isSecurityPermissionOpen(Context context) {
        long endTime = System.currentTimeMillis();
        UsageStatsManager usageStatsManager = (UsageStatsManager) context.getApplicationContext().getSystemService("usagestats");
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, endTime);
        if (queryUsageStats == null || queryUsageStats.isEmpty()) {
            return false;
        }
        return true;
    }
    
    
    //此處是跳轉安全許可權的跳轉程式碼,如果你判斷使用者沒有開啟許可權的話可以選擇跳轉,此處標明~~~
    //Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    //startActivity(intent);

僅供產考,歡迎指導~

相關文章