Отслеживание времени простоя пользователя в приложении в Android

Насколько я знаю, у меня нет системного API для получения времени простоя пользователя. Когда я говорю "время простоя пользователя", я имею в виду взаимодействие пользователя с сенсорным экраном в моем приложении. Поэтому я хочу отслеживать это самостоятельно. Путь, который приходит мне в голову, состоит в том, чтобы расширить Activity и переопределить onuserinteraction способ сохранить время последнего активного пользователя.

Но проблема в том, что в моем приложении несколько процессов. Я не уверен, что следующий путь является правильным и эффективным.

Я хочу использовать SharedPreference с MODE_WORLD_WRITEABLE флаг для сохранения последнего активного времени пользователя. Чтобы избежать проблемы с производительностью, я также кеширую последнее активное время в деятельности в каждой деятельности. И я только экономлю новое время SharedPrefernces если время различий> 1 секунда.

Этот способ эффективен по сравнению с использованием aidl? Собственно, действительно ли aidl также использует переменную общего доступа, используя файл? Если да, я думаю, что оба способа должны иметь одинаковую производительность, верно? Благодарю.

1 ответ

Решение

Вместо этого записывайте это каждый раз, везде, сделайте это глобальной функцией в вашем приложении:

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(),

Другие вопросы по тегам