上篇文章已经解释了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 pkgNames = new HashMap();
HashMap times = new HashMap();
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 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 map = mUsmManager.queryAndAggregateUsageStats(startTime, endTime);
for (Map.Entry 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 getUsageList() {
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.YEAR, -1);
long startTime = calendar.getTimeInMillis();
List 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下载地址