如何在Android中以编程方式使用 packagename 获取在特定应用上花费的时间?
在谷歌之后我发现了这个stack overflow question和this,但我没有得到任何正确的解决方案。
有没有人知道我如何获得所有Android版本的时间?
我也试过this,但我不想做后台服务。 当用户返回我的应用时,我只想知道用户是否在给定时间内使用该应用。
答案 0 :(得分:1)
我在下面提到的方法是一种非常有效的方法,可以让用户在android中获取应用的总花费时间。首先,您需要一个自定义的 ActivityLifecycleCallbacks ,它负责触发应用程序开始启动和停止的时间。您只需将 ActivityLifecycleCallbacks 注册到您的应用程序实例。这还将考虑是否有任何用户暂停了该应用程序,因此您无需考虑它。自定义的 ActivityLifecycleCallbacks 类为-
public class ApplicationTimeSpentTracker implements Application.ActivityLifecycleCallbacks {
private int activityReferences = 0;
private boolean isActivityChangingConfigurations = false;
private long startingTime;
private long stopTime;
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
}
@Override
public void onActivityStarted(Activity activity) {
if (++activityReferences == 1 && !isActivityChangingConfigurations) {
// App enters foreground
startingTime=System.currentTimeMillis()/1000; //This is the starting time when the app began to start
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
isActivityChangingConfigurations = activity.isChangingConfigurations();
if (--activityReferences == 0 && !isActivityChangingConfigurations) {
// App enters background
stopTime = System.currentTimeMillis() / 1000;//This is the ending time when the app is stopped
long totalSpentTime= stopTime-startTime; //This is the total spent time of the app in foreground
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
最后,您需要像这样在 MainActivity 中将回调注册到您的应用程序实例中-
activity.getApplication().registerActivityLifecycleCallbacks(new ApplicationTimeSpentTracker());
如果您需要详细信息,请在这里post
答案 1 :(得分:0)
为实现这一目标,你必须做两件事。
<强> 1。用户离开您的活动时启动计时器并转到另一个应用程序。
<强> 2。使用以下代码致电后台服务
private void check()
{
ActivityManager actvityManager = (ActivityManager)
this.getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningAppProcessInfo> procInfos = actvityManager.getRunningAppProcesses();
for(int i = 0; i < procInfos.size(); i++)
{
if(procInfos.get(i).processName.equals("specific pacakgename here")) {
//check time here
}
}
}