Отслеживание времени простоя пользователя в приложении в 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()
,