如何以编程方式在android中实现奖励系统?

如何以编程方式在android中实现奖励系统?,android,datetime,sharedpreferences,reward-system,Android,Datetime,Sharedpreferences,Reward System,我计划在我的android应用程序中实现一个奖励系统,该应用程序的用户每天打开应用程序可以获得100分。用户在一天内只能获得100分,无论他们打开应用程序的次数是多少。我不知道如何才能做到这一点,例如,一个名为WhatChat的应用程序,为用户每天打开应用程序提供积分: 我正在尝试实现一个类似的系统,但是每天只给用户100分。我知道我需要跟踪当天,可能需要使用SharedReferences将其存储在本地存储器中,并记录每天的日期,然后将记录点数的变量增加100 在伪代码中,它看起来像这样:

我计划在我的android应用程序中实现一个奖励系统,该应用程序的用户每天打开应用程序可以获得100分。用户在一天内只能获得100分,无论他们打开应用程序的次数是多少。我不知道如何才能做到这一点,例如,一个名为WhatChat的应用程序,为用户每天打开应用程序提供积分:

我正在尝试实现一个类似的系统,但是每天只给用户100分。我知道我需要跟踪当天,可能需要使用
SharedReferences
将其存储在本地存储器中,并记录每天的日期,然后将记录点数的变量增加100

在伪代码中,它看起来像这样:

Set CreditsGained to 0

IF app launched for the first time on Current date THEN
CreditsGained = CreditsGained + 100
Else 
Do nothing

如何在我的应用程序中实现这样的系统?

您可以在服务器上实现。他们每天第一次提出网络请求时,加上100分。无法在客户端安全地执行此操作。

您可以在服务器上执行此操作。他们每天第一次提出网络请求时,加上100分。客户端无法安全地执行此操作。

我建议您不要使用
共享首选项来保存所需的数据。因为他们可以修改它

只有一种方法可以保护它,你必须有自己的服务器来保存它。本地存储也不安全

但是,如果你想知道如何检查,为了学习,你也可以使用
共享首选项

步骤1:在
字符串中获取当前时间:

SimpleDateFormat sdf = new SimpleDateFormat("d-m-Y");
Calendar cal = Calendar.getInstance();
String dateInStr = sdf.format(cal.getTime());
步骤2:启动时检查活动。 在
onCreate()之后

好的,把第一步代码放在第二步代码上面,我只是把它分开以便理解

第三步:之后你可以检查他们是否有超过1次的检查点。如果这是他们一天中第一次退房,我们就给他们加100分

将其放在else语句中,位于
edit.putBoolean(dateInStr,true)之上


我建议您不要使用
共享首选项
来保存所需的数据。因为他们可以修改它

只有一种方法可以保护它,你必须有自己的服务器来保存它。本地存储也不安全

但是,如果你想知道如何检查,为了学习,你也可以使用
共享首选项

步骤1:在
字符串中获取当前时间:

SimpleDateFormat sdf = new SimpleDateFormat("d-m-Y");
Calendar cal = Calendar.getInstance();
String dateInStr = sdf.format(cal.getTime());
步骤2:启动时检查活动。 在
onCreate()之后

好的,把第一步代码放在第二步代码上面,我只是把它分开以便理解

第三步:之后你可以检查他们是否有超过1次的检查点。如果这是他们一天中第一次退房,我们就给他们加100分

将其放在else语句中,位于
edit.putBoolean(dateInStr,true)之上


我可能会晚些回答你的问题..但对于其他寻求奖励系统的不希望服务器处理这些东西-->

你可以 检查中是否启用了自动日期和时间选项 用户的设备

**。然后根据回复,你可以给用户奖励

例如


我希望它能帮助你!向上投票,祝你好运:)

我可能会晚些回答你的问题。但是对于其他寻求奖励系统的人,不希望服务器处理这些事情-->

你可以 检查中是否启用了自动日期和时间选项 用户的设备

**。然后根据回复,你可以给用户奖励

例如


我希望它能帮助你!向上投票并祝您好运:)

每当用户打开应用程序时,请检查本地存储中是否有可用的最后信用日期,如果有,请验证当前日期比存储的日期多一个,然后在第二天向用户信用

如果存储中没有日期,则可以假定这是第一天。是的,您可以在这个用例的MainActivity中这样做,因为您不会进行任何耗时的api调用


我只是分享了这个想法,找出代码。这很简单。

每当用户打开应用程序时,请检查本地存储中是否有可用的最后信用日期,如果有,请验证当前日期比存储的日期多一个,然后您为第二天的用户信用

如果存储中没有日期,则可以假定这是第一天。是的,您可以在这个用例的MainActivity中这样做,因为您不会进行任何耗时的api调用


我只是分享了这个想法,找出代码。这很简单。

我正在制作一个原型,目前我没有服务器。因此,基本上我想使用本地存储来实现这个系统,用于测试/用户测试。@SumOne检查我的解决方案Hi,步骤1中的代码,我应该将其粘贴到mainactivity中吗?此外,这是否每天只给用户一次积分,不管他们是否多次打开应用程序?请你帮助我了解应用程序中应该包含的内容,如果if语句为false,那么if语句将做什么,例如,我如何向现有应用程序添加100个学分?我正在制作一个原型,目前我没有服务器。因此,基本上我想使用本地存储来实现这个系统,用于测试/用户测试。@SumOne检查我的解决方案Hi,步骤1中的代码,我应该将其粘贴到mainactivity中吗?此外,这是否每天只给用户一次积分,不管他们是否多次打开应用程序?请你帮助我了解应用程序中应该包含的内容,如果if语句为false,那么if语句将做什么,例如,我如何向现有应用程序添加100个学分?我正在制作一个原型,目前我没有服务器。因此,基本上我想使用本地存储来实现这个系统,用于测试/用户测试目的。如果你没有真正做到这一点,你就不必做出正确的选择。写一份能给你带来快乐的工作
//get prev_score from SP
long previous_score = pre.getLong("score", 0);
//add 100
previous_score = previous_score + 100;
//save back to SP
edit.putLong("score", previous_score);
calendar= Calendar.getInstance();
year=calendar.get(Calendar.YEAR);
month=calendar.get(Calendar.MONTH);
day=calendar.get(Calendar.DAY_OF_MONTH);



  todaystring= year+ "" + month + "" + day + "";
   timepref=context.getSharedPreferences("REWARD",0);
   currentday=timepref.getBoolean(todaystring,false);


 //Daily reward
        if (!currentday && isZoneAutomatic(context) && isTimeAutomatic(context)) { //currentday =false
            btnrwrd.setEnabled(true);
            btnrwrd.setText("Collect your daily reward!");
            btnrwrd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(context, "Daily reward granted!", Toast.LENGTH_SHORT).show();
                   // Do your stuff here
                    // saving the date
                    SharedPreferences sharedPreferences = context.getSharedPreferences("SAVING", Context.MODE_PRIVATE);
                    SharedPreferences.Editor edt = sharedPreferences.edit();
                    edt.putInt("mypoints", Integer.valueOf(points.getText().toString()));
                    edt.apply();
                    Toast.makeText(context, String.valueOf(daily), Toast.LENGTH_SHORT).show();
                    SharedPreferences.Editor timedaily = timepref.edit();
                    timedaily.putBoolean(todaystring, true);
                    timedaily.apply();
                    btnrwrd.setText("Wait for 24 hrs");
                    btnrwrd.setEnabled(false);
                }
            });
}
else {
            Toast.makeText(context, "Your daily reward is over!", Toast.LENGTH_SHORT).show();
        }


    public static boolean isTimeAutomatic(Context c) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            return Settings.Global.getInt(c.getContentResolver(), Settings.Global.AUTO_TIME, 0) == 1;
        } else {
            return android.provider.Settings.System.getInt(c.getContentResolver(), android.provider.Settings.System.AUTO_TIME, 0) == 1;
        }
    }

    public static boolean isZoneAutomatic(Context c) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            return Settings.Global.getInt(c.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 0) == 1;
        } else {
            return android.provider.Settings.System.getInt(c.getContentResolver(), android.provider.Settings.System.AUTO_TIME, 0) == 1;
        }
    }