如何在Marshmallow中确定当前的前台应用程序名称?

问题描述 投票:0回答:3

我正在尝试在Marshmallow中识别当前的前台应用程序名称(请参见下图)。

enter image description here

==========================================

ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);

List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;

packagename = componentInfo.getPackageName();

==========================================

但似乎getRunningTasks()已被弃用。你能否建议另一种方式。

android foreground
3个回答
0
投票

您可以将am.getAppTasks().get(0).getTaskInfo().topActivity用于当前的应用程序。如果您想要进程级别信息,如进程名称,那么您可以使用am.getRunningAppProcesses().get(0).processName


0
投票

使用此方法可以使当前的前台应用程序正常工作

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);
}

0
投票

我找到了一个适用于Kitkat及以上版本的解决方案,由我测试。 (我之前没有测试过4.4)。

1.在清单文件中声明权限:

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

2.创建前台服务。

一个。在onCreate of Service中:

@Override
    public void onCreate() {
        super.onCreate();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForeground();
        }

        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {

                        printForegroundTask();
                   }
                });
            }

        };
        //Starts after 0 sec and will repeat on every 5 sec of time interval.
        timer.schedule(doAsynchronousTask, 0, 5000);

湾打印前台应用程序包名称日志的方法:

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<>();
                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);
    }

3.安装应用程序后。获取您的应用程序的此用法访问权限:See this image

你已准备好出发。 :)

© www.soinside.com 2019 - 2024. All rights reserved.