繁体   English   中英

Android:获取已安装应用程序的运行时间

[英]Android: get running time of installed apps

我们如何显示所有已安装的应用程序的运行时间并获取应用程序的最后使用情况并显示它? 我得到所有已安装的应用程序并显示它,但我也想显示应用程序的运行时间。

尝试这个:

在清单文件中添加:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />
<uses-permission
    android:name="android.permission.QUERY_ALL_PACKAGES"
    tools:ignore="QueryAllPackagesPermission" />

您还需要在运行时获取 package 使用统计权限

使用此 function 检查使用统计权限:

@TargetApi(Build.VERSION_CODES.M)
public static boolean hasUsageStatsPermission(Context context) {
    boolean granted = false;
    AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), context.getPackageName());
    if (mode == AppOpsManager.MODE_DEFAULT)
        granted = (context.checkCallingOrSelfPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) == PackageManager.PERMISSION_GRANTED);
    else
        granted = (mode == AppOpsManager.MODE_ALLOWED);
    return granted;
}

如果您没有权限,请使用此代码将用户带到您应用的权限页面:

startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY).setData(Uri.parse("package:" + "your package name")))

现在是您获取所有已安装应用程序的最后使用时间的实际部分:

PackageManager packageManager = getPackageManager();
List<ApplicationInfo> applicationInfoList = packageManager.getInstalledApplications(0);
UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -1);
long start = calendar.getTimeInMillis();
long end = System.currentTimeMillis();
stats = usageStatsManager.queryAndAggregateUsageStats(start, end);

for (ApplicationInfo info : applicationInfoList) {
            GetAppInfo(info);
        }

现在GetAppInfo function:

UsageStats usageStats = stats.get(info.packageName);
long lastTimeUsed;
long actualLastTimeUsed;
  if(usageStats!=null){
     lastTimeUsed = usageStats.getLastTimeUsed();
      actualLastTimeUsed = currentTime - lastTimeUsed;
  }

如您所见,仅获取所有已安装应用程序的最后使用时间是一个漫长的过程。

注意:请记住在后台/工作线程而不是 UI 或主线程中执行所有这些操作,否则它可能会冻结 ui

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM