背景:在做一个App Lock的demo,完全从应用层的层面去实现。

在5.0以下通过ActivityManager类的getRunningTasks()获取当前打开的所有应用程序 。

在5.0版本之后废弃了getRunningTasks()方法,意味着我们在5.0以后不能通过该方法获取正在运行的应用程序,google在5.0又提供类新的api,可以通过ActivityManager的getRunningAppProcesses()方法获取正在运行的应用程序 。

然后在5.1的版本发布后getRunningAppProcesses()已经获取不到正在运行的服务,在5.0版本google提供了一个UsageStatsManager类,通过这个类可以获取到应用程序的运行情况。

 

使用方法:

1 添加权限:

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

添加了这个权限以后,在设置界面的“有权查看使用情况的应用”中就可以看到我们的这个应用了。

2 引导用户进入授权界面授权:

我们通过启动Action为Settings.ACTION_USAGE_ACCESS_SETTINGS的activity,引导用户进入“有权查看使用情况的应用”界面,将应用的这个权限打开,否则后面获取信息时是获取不到信息的。

3 真正的代码使用:

1)调用相关代码获取栈顶的activity的方法:


usm = ((UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE));
long endTime = System.currentTimeMillis();
long startTime = endTime - 10000;
//查询这段时间内的所有使用事件
UsageEvents usageEvents = usm.queryEvents(startTime, endTime);
UsageEvents.Event event = new UsageEvents.Event();
//遍历这个事件集合,如果还有下一个事件
while (usageEvents.hasNextEvent()){
    //得到下一个事件放入event中,先得得到下个一事件,如果这个时候直接调用,则	event的package是null,type是0。
    usageEvents.getNextEvent(event);
    Log.d("sjx","package == "+event.getPackageName()+",  type == "+event.getEventType());
    //如果这是个将应用置于前台的事件
    if(event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND){
        //获取这个前台事件的packageName.
        topPackageName = event.getPackageName();
        //Log.d("sjx","topPackageName == " + topPackageName);
    }
}

这样通过之前10s到当前时间的应用使用情况,获取app置于前台的时间,拿到该事件的packageName,就获取了位于栈顶的activity,在AppLock的实现中,是有一个无限循环,每隔300s,调用上面的方法获取一下位于栈顶的activity,然后通过判断要不要打开加锁界面。

 

2)获取一段时间内的应用的使用情况:

调用UsageStatsManager的queryUsageStats(int intervalType, long beginTime, long endTime)方法,其中参数:

a) intervalType:时间间隔类型,有五种

INTERVAL_DAILY: 日长短级别数据,最长7天内的数据;

INTERVAL_WEEKLY: 星期长短级别数据,最长4个星期内的数据;

INTERVAL_MONTHLY: 月长短级别数据,最长6个月内的数据;

INTERVAL_YEARLY: 年长短级别数据,最长2年内的数据,也就是说,数据最长保存2年;

INTERVAL_BEST: 根据提供的时间间隔(根据与第二个参数和第三个参数获取),自动搭配最好的级别

b) beginTime:开始统计的时间

c) endTime:结束的时间

返回值为:List<UsageStats>。

这样我们获得了一段时间内的所有应用的使用情况的数据。

通过UsageStats类提供的方法再得到应用具体的使用数据。