我正在Android应用程序中创建一个自定义启动器,我想跟踪打开哪个应用程序的实际时间。
假设我打开Facebook 10分钟,我理想的是5分钟如何计算用户使用的5分钟。
谢谢
答案 0 :(得分:0)
您可以定义两个按钮来启动和停止服务。触发“开始”按钮的意图,如下所示:
Intent startServiceIntent = new Intent();
startServiceIntent.setClass(this, MainService.class);
startServiceIntent.setComponent(new ComponentName(this, MainService.class));
bindService(startServiceIntent, mConnection, Context.BIND_AUTO_CREATE);
在服务中,您可以定义广播接收器以检测屏幕开关事件。
private BroadcastReceiver screenWakeUp = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals("android.intent.action.SCREEN_ON")) {
isRunningForegroundAppsThread = true;
isScreenOn = true;
startThread();
}
}
};
从这里开始,您可以启动一个不断在循环内运行的线程,并检查用户正在使用的应用程序是否同时发生了变化。如果有,您可以在地图中更新该应用的时间,否则您可以继续。在SCREEN_OFF事件中,您可以停止该线程,因为用户不再使用手机。
您可以使用以下方法检索应用程序名称:
ActivityManager am = (ActivityManager) mContext.getSystemService(ACTIVITY_SERVICE);
PackageManager pm = mContext.getPackageManager();
ApplicationInfo af = null;
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
// String activity = taskInfo.get(0).topActivity.getClassName();
ComponentName c = taskInfo.get(0).topActivity;
String packageName = c.getPackageName();
try {
af = pm.getApplicationInfo(packageName, 0);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String app_Name_current = (String) pm.getApplicationLabel(af);
它完全取决于您的要求,如果需要,时间可以存储在数据库中。此外,这仅记录需要屏幕打开的应用程序的时间,因此您必须单独维护后台应用程序的时间并将其存储在单独的地图中。最后,当您按下停止按钮时,您可以在列表视图或您认为适合的任何UI元素中显示结果。
我知道这不是完整的代码,但我想它会让你知道如何去做。另外,我说虽然这可以解决问题,但它并不是实现相同目标的好方法,因为PackageManager对象是重量级的并且连续处理它们是昂贵的操作。
上述方法仅适用于pre-L设备,因为ActivityManager已在API级别21中弃用。因此,您必须为Lollypop设备使用UsageStats类。