1

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

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

我想使用SharedPreferencewith MODE_WORLD_WRITEABLEflag 来存储用户上次活动时间。为了避免性能问题,我还在每个活动中缓存了活动内的最后活动时间。SharedPrefernces如果差异时间> 1秒,我只会将新时间保存到。

与使用aidl相比,这种方式有效吗?实际上,aidl 是否也使用文件共享变量?如果是,我认为这两种方式应该具有相似的性能,对吧?谢谢。

4

1 回答 1

7

而不是每次都从任何地方写下来,让它成为你应用程序中的一个全局函数:

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);
    }
}

将应用程序类添加到清单:<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();
    }

}

现在,从这个类扩展你所有的活动,它们都将自动保存时间,并且可以使用getElapsed().

于 2013-01-27T06:17:35.893 回答