Detect which app has been launched in android

后端 未结 3 1074
孤城傲影
孤城傲影 2021-01-21 21:54

How to detect which app has been launched by user in my app i.e my application should get notified when Whatsapp is launched by user even if my app is not running in foreground

3条回答
  •  别那么骄傲
    2021-01-21 22:17

    Depending on the Android version running your application, you will have to use different methods. On Pre-Lollipop devices, it is pretty straight-forward:

    String[] result = new String[2];
    
    List runningTasks;
    ComponentName componentInfo;
    
    runningTasks = activityManager.getRunningTasks(1);
    componentInfo = runningTasks.get(0).topActivity;
    result[0] = componentInfo.getPackageName();
    result[1] = componentInfo.getClassName();
    

    If you are on a Lollipop or newer device, you have to use UsageStatsManager class, which requires your application to be granted specific permissions

    //no inspection ResourceType
    UsageStatsManager mUsageStatsManager = (UsageStatsManager)context.getSystemService("usagestats");
    long time = System.currentTimeMillis();
    
    // We get usage stats for the last 10 seconds
    List stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);
    
    // Sort the stats by the last time used
    if(stats != null) {
        SortedMap mySortedMap = new TreeMap<>();
        for (UsageStats usageStats : stats) {
            mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
        }
        if(mySortedMap != null && !mySortedMap.isEmpty()) {
            return mySortedMap.get(mySortedMap.lastKey()).getPackageName();
        }
    }
    
    return null;
    

    This will tell you if your apps has been granted permissions:

    try {
        PackageManager packageManager = context.getPackageManager();
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
        AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName);
        return (mode != AppOpsManager.MODE_ALLOWED);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    

    And finally this will launch the Android permission granting activity for the user:

    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    activity.startActivity(intent);
    

    Hope that helps

提交回复
热议问题