Как я могу случайно наградить баллы за использование приложения - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над приложением для Android, где пользователь получает очки за использование приложения, которое можно использовать для разблокировки функций внутри приложения.

У меня есть функция с именем rewardPoints(), которая генерирует случайное целое число, и я хочуон вызывается случайным образом, пока пользователь использует приложение.Затем очки добавляются в базу данных.

fun rewardPoints() {
        var points = Random().nextInt((5-1) + 1)
}

Как мне вызвать функцию rewardPoints() случайным образом, когда пользователь использует приложение или взаимодействует с ним?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете добавить наблюдателя к своим действиям, проверить, есть ли у вас активные действия, и в этом случае запустить периодическое задание для начисления баллов.

Пример:

class MyApp : Application(), Application.ActivityLifecycleCallbacks {

    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(this)
    }

    var count: Int by Delegates.observable(0) { _, old, newValue ->
        when (newValue) {
            0 -> onBackground()
            1 -> if (old == 0) onForeground()
        }
    }

    override fun onActivityResumed(activity: Activity?) {
        count++
    }
    override fun onActivityPaused(activity: Activity?) {
        count--
    }


    fun onForeground() {
        Log.d("TAG", "start.")
        events.start()
    }

    fun onBackground() {
        Log.d("TAG", "stop.")
        events.cancel()
    }


    val events = object: CountDownTimer(Long.MAX_VALUE, 1000) {
        // is called once per second as long as your app is in foreground
        override fun onTick(millisUntilFinished: Long) {
            if (ThreadLocalRandom.current().nextInt(100) < 5) {
                Toast.makeText(this@MyApp, "You earned a point.", Toast.LENGTH_SHORT).show()
            }
        }
        override fun onFinish() { /* will never happen */}
    }

    /* not needed */
    override fun onActivityStarted(activity: Activity?) {}
    override fun onActivityDestroyed(activity: Activity?) {}
    override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {}
    override fun onActivityStopped(activity: Activity?) {}
    override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {}
}

Если выиспользовать компоненты архитектуры Lifecycle, реализация которых выше еще проще с https://developer.android.com/reference/android/arch/lifecycle/ProcessLifecycleOwner и прослушивание желаемого Lifecycle.Event

0 голосов
/ 16 октября 2018

Я бы использовал Обработчик , чтобы опубликовать Runnable , который повторно публикует себя.Например,

val handler = Handler()
handler.post({
    rewardPoints()
    handler.postDelayed(this, DELAY_TIME_MS)
})

Вы можете включить это в onResume своей Деятельности и остановить его onPause, чтобы убедиться, что оно работает только при активном приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...