1

私の知る限り、ユーザーのアイドル時間を取得するためのシステムAPIはありません。ユーザーのアイドル時間とは、アプリ内のタッチスクリーンでユーザーが何らかの操作を行うことを意味します。ですから、自分で追跡したいと思います。私の頭に浮かぶ方法は、メソッドを拡張Activityしてオーバーライドonuserinteractionし、最後のユーザーのアクティブ時間を節約することです。

しかし、課題は、私のアプリに複数のプロセスがあることです。次の方法が正しく効率的な方法かどうかはわかりません。

SharedPreferenceフラグとともに使用してMODE_WORLD_WRITEABLE、ユーザーの最後のアクティブ時間を保存したいと思います。パフォーマンスの問題を回避するために、各アクティビティのアクティビティ内の最後のアクティブ時間もキャッシュします。SharedPreferncesそして、差分時間が1秒を超える場合にのみ、新しい時間を保存します。

この方法は、aidlを使用する場合と比較して効率的ですか?実際、aidlもファイルを使用して変数を共有していますか?はいの場合、2つの方法で同様のパフォーマンスが得られるはずです。ありがとう。

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クラスを追加します。<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 に答える