android - 在 Android 应用程序内跟踪用户空闲时间

标签 android sharedpreferences aidl

据我所知,没有系统 API 可以让我获取用户空闲时间。当我说用户空闲时间时,我的意思是用户在我的应用程序中的触摸屏上进行了一些交互。因此,我想自己跟踪它。我想到的方法是扩展 Activity 并覆盖 onuserinteraction 方法以保存最后一个用户 Activity 时间。

但挑战在于我的应用有多个进程。我不确定以下方式是否正确且有效。

我想使用带有 MODE_WORLD_WRITEABLE 标志的 SharedPreference 来存储用户上次 Activity 时间。为了避免性能问题,我还在每个 Activity 的 Activity 中缓存了最后一个 Activity 时间。如果差异时间 > 1 秒,我只会将新时间保存到 SharedPrefernces

这种方式与使用aidl相比效率高吗?其实aidl也是用file共享变量的吗?如果是的话,我认为这两种方式应该具有相似的性能,对吧?谢谢。

最佳答案

与其每次都从任何地方写下来,不如将其作为您应用程序中的全局函数:

public class MyApp extends Application {
    private static SharedPreferences sPreference;

    private static final long MIN_SAVE_TIME = 1000;
    private static final String PREF_KEY_LAST_ACTIVE = "last_active";
    private static final String PREF_ID_TIME_TRACK = "time_track";

    public static void saveTimeStamp(){
        if(getElapsedTime() > MIN_SAVE_TIME){
            sPreference.edit().putLong(PREF_KEY_LAST_ACTIVE, timeNow()).commit();
        }
    }

    public static long getElapsedTime(){
        return timeNow() - sPreference.getLong(PREF_KEY_LAST_ACTIVE,0);
    }

    private static long timeNow(){
        return Calendar.getInstance().getTimeInMillis();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sPreference = getSharedPreferences(PREF_ID_TIME_TRACK,MODE_PRIVATE);
    }
}

将应用程序类添加到 list :<application android:name="com.example.MyApp"

在抽象 Activity 类中放置保存功能:

public abstract class TimedActivity extends Activity {

    @Override
    public void onUserInteraction() {
        super.onUserInteraction();
        MyApp.saveTimeStamp();
    }

    public long getElapsed(){
        return MyApp.getElapsedTime();
    }

}

现在,从这个类中扩展你所有的 Activity ,所有这些 Activity 都将自动保存时间,并且将能够使用getElapsed() .

关于android - 在 Android 应用程序内跟踪用户空闲时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543842/

相关文章:

android - Sharepreference来存储int值

android - Android注解中Main Thread、Ui Thread、WorkerThread、Binder Thread的区别

android - 如何访问android中 Activity 之间的共享偏好?

android - 当应用程序启动时,使 Activity 仅出现一次

android - 如何在 libGDX 项目中实现原生 Google Play 应用内结算?

从 Java 到 C++ 的 Android AIDL

android studio - 包重命名返回错误

android - 在未集成 Google 移动广告的情况下在 Android 上使用 Google Advertising Id

java - 在 HttpURLConnection.setFixedLengthSTreamingMode() 中获取异常

android - Android 中的 LayoutInflater 有什么作用?