Android5.1应用打开次数获取

上篇文章已经解释了Android5.1系统是如何获取打开次数(如果不懂可以先读我上篇文章http://blog.csdn.net/elder_sword/article/details/50809642),但最后我们用系统api拿到的并不是精确的打开次数,有人可能会问,不就一个打开次数嘛,我去写个service,不断去扫栈顶activity获取包名来监听次数不可以吗?当然可以,只要你能接受。这里我接着上次的问题,怎么才能拿到精确的打开次数呢?

最终我们分析得出是因为相同的应用可能在打开的时候会同时打开多个activity,其实说简单也很简单,就是每个包名只取一个class去当作打开的唯一标识

下面我写几个测试方法,分别打印出我们自己过滤的和系统的


public class MainActivity extends Activity {

    private Button bt_statistics;
    private UsageStatsManager mUsmManager;
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("M-d-yyyy HH:mm:ss");
    public final String TAG_U = "StatsTest_Usage";
    public final String TAG_E = "StatsTest_Events";
    public final String TAG_A = "StatsTest_Aggregate";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_statistics = (Button) findViewById(R.id.bt_statistics);
        mUsmManager = getUsageStatsManager();
        bt_statistics.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (getUsageList().isEmpty()) {
                    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                    startActivity(intent);
                } else {
                    printCurrentUsageStatus();
                }
            }
        });
    }

    public void printCurrentUsageStatus() {
        try {
            printEvents();
            printAggregatedStats();
            printUsageStats(getUsageList());
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @SuppressWarnings("ResourceType")
    private UsageStatsManager getUsageStatsManager() {
        UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats");
        return usm;
    }

    public void printEvents() throws NoSuchFieldException {
        Calendar calendar = Calendar.getInstance();
        long endTime = calendar.getTimeInMillis();
        calendar.add(Calendar.YEAR, -1);
        long startTime = calendar.getTimeInMillis();

        Log.d(TAG_U, "Range start:" + dateFormat.format(startTime));
        Log.d(TAG_U, "Range end:" + dateFormat.format(endTime));

        UsageEvents events = mUsmManager.queryEvents(startTime, endTime);
        HashMap<String, String> pkgNames = new HashMap<String, String>();
        HashMap<String, Integer> times = new HashMap<String, Integer>();
        while (events.hasNextEvent()) {
            UsageEvents.Event e = new UsageEvents.Event();
            events.getNextEvent(e);
            if (e != null && e.getEventType() == 1) {
                String packageName = e.getPackageName();
                String className = e.getClassName();
                String clazz = pkgNames.get(packageName);
                if (clazz == null || clazz.equals("")) {
                    pkgNames.put(packageName, className);
                    times.put(packageName, 1);
                } else if (clazz.equals(className)) {
                    times.put(packageName, times.get(packageName) + 1);
                }
                Log.d(TAG_U, "Event:----lasttime = " + DateUtils.formatSameDayTime(e.getTimeStamp(), System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM)
                        + "---- pkgname = " + packageName
                        + "----class = " + e.getClassName()
                        + "----type =" + e.getEventType());
            }
        }
        Log.d(TAG_U, times + "");
    }

    public void printUsageStats(List<UsageStats> usageStatsList) throws IllegalAccessException, IllegalArgumentException, NoSuchFieldException {
        for (UsageStats u : usageStatsList) {
            Log.d(TAG_E, "Pkg = " + u.getPackageName()
                    + "----ForegroundTime = " + DateUtils.formatElapsedTime(u.getTotalTimeInForeground() / 1000)
                    + "----lasttimeuser = " + DateUtils.formatSameDayTime(u.getLastTimeUsed(), System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM)
                    + "----times = " + u.getClass().getDeclaredField("mLaunchCount").getInt(u));
        }

    }

    public void printAggregatedStats() throws NoSuchFieldException, IllegalAccessException {
        Calendar calendar = Calendar.getInstance();
        long endTime = calendar.getTimeInMillis();
        calendar.add(Calendar.YEAR, -1);
        long startTime = calendar.getTimeInMillis();
        Map<String, UsageStats> map = mUsmManager.queryAndAggregateUsageStats(startTime, endTime);
        for (Map.Entry<String, UsageStats> entry : map.entrySet()) {
            UsageStats stats = entry.getValue();
            Log.d(TAG_A,"key= " + entry.getKey() + "Pkg = " + stats.getPackageName()
                    + "----ForegroundTime = " + DateUtils.formatElapsedTime(stats.getTotalTimeInForeground() / 1000)
                    + "----lasttimeuser = " + DateUtils.formatSameDayTime(stats.getLastTimeUsed(), System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM)
                    + "----times = " + stats.getClass().getDeclaredField("mLaunchCount").getInt(stats));
        }
    }
    private List<UsageStats> getUsageList() {
        Calendar calendar = Calendar.getInstance();
        long endTime = calendar.getTimeInMillis();
        calendar.add(Calendar.YEAR, -1);
        long startTime = calendar.getTimeInMillis();
        List<UsageStats> usageList = mUsmManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
        return usageList;
    }

}

这里我自己过滤的是先拿到系统event列表,这个列表可以看到并没像queryUsageStats方法传intervalType参数,但其实内部是写死了intervalType 用INTERVAL_BEST,主要原因是event列表里的东西只会保留几天的,而你拿到的只是当天的event。我们可以看一下log

StatsTest_Usage

03-05 17:22:23.773    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Range start:3-5-2015 17:22:23
03-05 17:22:23.773    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Range end:3-5-2016 17:22:23
03-05 17:22:23.786    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午9:03:09---- pkgname = com.android.mms----class = com.android.mms.ui.DialogModeActivity----type =1
03-05 17:22:23.787    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:28:13---- pkgname = com.android.mms----class = com.android.mms.ui.DialogModeActivity----type =1
03-05 17:22:23.787    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:28:17---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.787    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:28:31---- pkgname = com.android.settings----class = com.android.settings.Settings----type =1
03-05 17:22:23.788    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:28:33---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.788    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:28:41---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.SplashActivity----type =1
03-05 17:22:23.789    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:29:02---- pkgname = com.tencent.mobileqq----class = cooperation.qzone.QzoneGPUPluginProxyActivity----type =1
03-05 17:22:23.789    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:30:11---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.QQBrowserDelegationActivity----type =1
03-05 17:22:23.790    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:30:11---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.QQBrowserActivity----type =1
03-05 17:22:23.790    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:30:30---- pkgname = com.tencent.mobileqq----class = cooperation.qzone.QzoneGPUPluginProxyActivity----type =1
03-05 17:22:23.791    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:30:59---- pkgname = com.tencent.mobileqq----class = cooperation.qzone.QzoneTransWithKeyboardPluginProxyActivity----type =1
03-05 17:22:23.791    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:00---- pkgname = com.tencent.mobileqq----class = cooperation.qzone.QzoneGPUPluginProxyActivity----type =1
03-05 17:22:23.791    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:01---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.SplashActivity----type =1
03-05 17:22:23.792    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:05---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.ChatActivity----type =1
03-05 17:22:23.792    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:07---- pkgname = com.tencent.mobileqq----class = com.tencent.biz.pubaccount.PublicAccountBrowser----type =1
03-05 17:22:23.793    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:16---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.ChatActivity----type =1
03-05 17:22:23.793    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:18---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.SplashActivity----type =1
03-05 17:22:23.793    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:26---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.794    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:30---- pkgname = com.tencent.mobileqq----class = com.tencent.mobileqq.activity.SplashActivity----type =1
03-05 17:22:23.794    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午10:31:36---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.794    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:03:50---- pkgname = com.tencent.android.qqdownloader----class = com.qq.AppService.StartApp----type =1
03-05 17:22:23.795    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:03:52---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.795    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:43---- pkgname = com.android.packageinstaller----class = com.android.packageinstaller.UninstallerActivity----type =1
03-05 17:22:23.795    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:45---- pkgname = com.android.packageinstaller----class = com.android.packageinstaller.UninstallAppProgress----type =1
03-05 17:22:23.796    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:45---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.796    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:51---- pkgname = com.android.packageinstaller----class = com.android.packageinstaller.UninstallerActivity----type =1
03-05 17:22:23.796    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:52---- pkgname = com.android.packageinstaller----class = com.android.packageinstaller.UninstallAppProgress----type =1
03-05 17:22:23.797    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:53---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.797    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:58---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.797    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:04:59---- pkgname = com.android.settings----class = com.android.settings.Settings$UsageAccessSettingsActivity----type =1
03-05 17:22:23.798    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:05:35---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.798    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:05:37---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.799    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:05:39---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.799    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:33:35---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.800    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:33:37---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.800    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:33:45---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.800    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:33:46---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.800    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:43:24---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.801    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:43:26---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.801    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:45:44---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.801    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:45:46---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.801    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:47:50---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.802    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:47:52---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.802    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:49:10---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.802    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:49:11---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.802    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:51:46---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.803    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:51:48---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.803    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:51:53---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.804    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 上午11:51:54---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.804    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:09:17---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.805    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:12:55---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.805    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:12:57---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.805    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:39:50---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.806    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:39:52---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.806    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:40:00---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.807    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:40:02---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.807    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:41:56---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.808    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:41:59---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.808    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:42:49---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.809    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:42:53---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.809    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:43:44---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.810    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:43:46---- pkgname = com.android.settings----class = com.android.settings.Settings$UsageAccessSettingsActivity----type =1
03-05 17:22:23.810    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:47:11---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.810    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:47:13---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.811    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:47:15---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.811    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:47:17---- pkgname = com.android.settings----class = com.android.settings.Settings$UsageAccessSettingsActivity----type =1
03-05 17:22:23.812    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:47:26---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.813    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:49:06---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.814    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午12:49:07---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.814    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午3:39:18---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.814    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午3:51:53---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.814    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午5:21:56---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.815    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午5:22:01---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.815    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午5:22:06---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.815    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午5:22:07---- pkgname = com.example.demo----class = com.test.pp.TestMain----type =1
03-05 17:22:23.816    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午5:22:08---- pkgname = com.android.pplauncher3----class = com.android.pplauncher3.Launcher----type =1
03-05 17:22:23.817    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ Event:----lasttime = 下午5:22:14---- pkgname = com.elder.usagetest----class = com.elder.usagetest.MainActivity----type =1
03-05 17:22:23.817    2604-2604/com.elder.usagetest D/StatsTest_Usage﹕ {com.android.packageinstaller=2, com.elder.usagetest=13, com.android.pplauncher3=20, com.tencent.mobileqq=4, com.android.mms=2, com.android.settings=1, com.example.demo=20, com.tencent.android.qqdownloader=1}

StatsTest_Events

03-05 17:22:23.844    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.tencent.android.qqdownloader----ForegroundTime = 00:00----lasttimeuser = 上午11:03:50----times = 1
03-05 17:22:23.845    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.android.mms----ForegroundTime = 00:04----lasttimeuser = 上午10:28:17----times = 2
03-05 17:22:23.845    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.elder.usagetest----ForegroundTime = 1:32:10----lasttimeuser = 下午5:22:14----times = 13
03-05 17:22:23.846    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.tencent.mobileqq----ForegroundTime = 02:49----lasttimeuser = 上午10:31:36----times = 13
03-05 17:22:23.846    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.android.packageinstaller----ForegroundTime = 00:03----lasttimeuser = 上午11:04:53----times = 4
03-05 17:22:23.847    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.example.demo----ForegroundTime = 1:07:13----lasttimeuser = 下午5:22:08----times = 20
03-05 17:22:23.847    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.android.settings----ForegroundTime = 04:11----lasttimeuser = 下午12:47:26----times = 4
03-05 17:22:23.848    2604-2604/com.elder.usagetest D/StatsTest_Events﹕ Pkg = com.android.pplauncher3----ForegroundTime = 44:51----lasttimeuser = 下午5:22:14----times = 20

StatsTest_Aggregate

03-05 17:22:23.830    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.tencent.android.qqdownloaderPkg = com.tencent.android.qqdownloader----ForegroundTime = 00:00----lasttimeuser = 上午11:03:50----times = 1
03-05 17:22:23.830    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.android.mmsPkg = com.android.mms----ForegroundTime = 00:04----lasttimeuser = 上午10:28:17----times = 2
03-05 17:22:23.831    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.elder.usagetestPkg = com.elder.usagetest----ForegroundTime = 1:32:10----lasttimeuser = 下午5:22:14----times = 13
03-05 17:22:23.832    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.tencent.mobileqqPkg = com.tencent.mobileqq----ForegroundTime = 02:49----lasttimeuser = 上午10:31:36----times = 13
03-05 17:22:23.832    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.android.packageinstallerPkg = com.android.packageinstaller----ForegroundTime = 00:03----lasttimeuser = 上午11:04:53----times = 4
03-05 17:22:23.833    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.example.demoPkg = com.example.demo----ForegroundTime = 1:07:13----lasttimeuser = 下午5:22:08----times = 20
03-05 17:22:23.833    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.android.settingsPkg = com.android.settings----ForegroundTime = 04:11----lasttimeuser = 下午12:47:26----times = 4
03-05 17:22:23.834    2604-2604/com.elder.usagetest D/StatsTest_Aggregate﹕ key= com.android.pplauncher3Pkg = com.android.pplauncher3----ForegroundTime = 44:51----lasttimeuser = 下午5:22:14----times = 20

event的我只保留了type为1的,因为打开次数没有必要保留在后台的情况,对比发现,明显使用系统自带的api拿到的打开次数高,而过滤后的次数是和我打开应用的实际情况相同的

这里得强调一下权限问题,上篇文章刚开始贴出的UsageStatsManager 里面注释说的很清楚一般应用没有办法直接取得权限,必须先手动打开“有权查看使用情况的应用”里面当前应用的开关。如图

这里写图片描述

而在系统内置应用可以忽略,应为权限够高,直接可以找到打开switch开关的代码直接使用,当然我也试过反射的方法在第三方应用中使用,但是没有成功,依赖太多,有兴趣的同学可以试试。

//系统应用直接赋权限代码
AppOpsManager mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_PERMISSIONS);
mAppOpsManager.setMode(43, packageInfo.applicationInfo.uid,context.getPackageName(), AppOpsManager.MODE_ALLOWED);

还有比较重要的一点,就是manifest里面的权限配置,如果不添加

xmlns:tools="http://schemas.android.com/tools"

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

就算你第一次打开勾选界面也没有你的应用在里面,第二句是为了忽略报错用的,别忘了在命名空间添加tools。

demo下载地址

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值