【问题标题】:How to get Top Activity in Android 5.0 +如何在 Android 5.0 + 中获取 Top Activity
【发布时间】:2016-04-12 05:04:09
【问题描述】:

我正在使用下面的代码来获取热门活动

private String getTopPackageName() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        return activityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
    } else {
        final List<ActivityManager.RunningAppProcessInfo> pis = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo pi : pis) {
            if (pi.pkgList.length == 1) return pi.pkgList[0];
        }
    }
    return "";
}

它在 API=21 上返回 "" :( 如何得到它? 我会试试的:

private void printForegroundTask() {
String currentApp = "NULL";
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
    long time = System.currentTimeMillis();
    List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - 1000*1000, time);
    if (appList != null && appList.size() > 0) {
        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
        for (UsageStats usageStats : appList) {
            mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
        }
        if (mySortedMap != null && !mySortedMap.isEmpty()) {
            currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
        }
    }
} else {
    ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
    currentApp = tasks.get(0).processName;
}

Log.e(TAG, "Current App in foreground is: " + currentApp);

}

但返回 NULL :(请帮助我!谢谢

【问题讨论】:

  • getRunningTasks 已弃用。
  • 我知道,但是什么时候通过 UsageStatsManager 不起作用?它返回 null,我错过了一些东西,但我不知道 :(

标签: android android-activity process


【解决方案1】:

getRunningTasks()API 级别 21(Lollipop)

中已弃用

你也可以这样做

List<ActivityManager.RunningAppProcessInfo> task = manager.getRunningAppProcesses();
ComponentName componentInfo = task.get(0).importanceReasonComponent;
String packageName = componentInfo.getPackageName()

注意:

此方法仅用于调试和呈现任务管理用户界面。这绝不应该用于应用程序中的核心逻辑,例如根据此处找到的信息来决定不同的行为。

Refer the doc

更新:

    ActivityManager manager = (ActivityManager) MainActivity.this.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> task = manager.getRunningAppProcesses();
    ActivityManager.RunningAppProcessInfo runningAppProcessInfo = null;

    for(ActivityManager.RunningAppProcessInfo singleTask : task){
        if(singleTask.importanceReasonComponent !=null){
            runningAppProcessInfo = singleTask;
            break;
            }
    }

    if(runningAppProcessInfo!=null) {
        ComponentName componentInfo = runningAppProcessInfo.importanceReasonComponent;
        String packageName = componentInfo.getPackageName();
        Log.d("myPackageName", packageName);
    }

【讨论】:

  • 我知道:私有字符串 getTopPackageName() { if (Build.VERSION.SDK_INT pis = activityManager.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo pi : pis) { if (pi.pkgList.length == 1) return pi.pkgList[0]; } } 返回 ””; }
  • 它返回什么?空?
  • 好的,等我看看
  • 在 android 5.1 上测试时返回 null :(
  • 您是否复制了相同的代码?仍然返回 null ?
【解决方案2】:

您也可以使用辅助功能服务,但为此您需要将用户重定向到辅助功能设置以将其打开。下面的示例代码用于获取刚刚打开的应用程序包,或者在您的情况下为顶部活动。

  public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
             String packageName = event.getPackageName();

        }
  }

【讨论】:

  • 太棒了!你拯救了我的一天。谢谢!
【解决方案3】:

您需要对 UsageStatsManager 的使用权限“PACKAGE_USAGE_STATS”

“此API需要android.permission.PACKAGE_USAGE_STATS权限,该权限是系统级权限,不会授予第三方应用。但是,声明该权限意味着有意使用API 和设备用户可以通过设置应用授予权限。”

参考:https://developer.android.com/reference/android/app/usage/UsageStatsManager.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2022-11-26
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多