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

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

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

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

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


person Bear    schedule 27.01.2013    source источник
comment
ты пробовал таймер обратного отсчета??   -  person Swati    schedule 27.01.2013


Ответы (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().

person S.D.    schedule 27.01.2013
comment
Спасибо за предложение, но не могли бы вы высказать свое мнение о производительности? - person Bear; 27.01.2013
comment
Кстати, я думаю, есть ли причина помещать эти функции в приложение, а не в базовый класс Activity? Вы хотите, чтобы они поделились общими предпочтениями? - person Bear; 27.01.2013
comment
@Bear Вполне возможно, что SharedPerference — это файл в каталоге данных ваших приложений, который читается/записывается несколько раз, как и файл журнала. Поскольку содержимое представляет собой не что иное, как 64-битное число, оно максимально быстрое. Класс приложения является глобальным, а его методы статическими, и вы можете вызывать их откуда в своем приложении, а не только из действий. - person S.D.; 27.01.2013