实施奖励制度

时间:2017-01-20 18:26:54

标签: android datetime sharedpreferences reward-system

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

enter image description here 我正在尝试实施类似的系统,但每天只为用户提供100点打开应用程序。我知道我需要跟踪当天,并可能使用共享偏好将其存储在本地存储中,并记录每天的日期,然后将记录点数的变量增加100。

在伪代码中,它看起来像这样(我认为);

Set CreditsGained to 0

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

请有人指导我如何在我的应用程序中实现此类系统。

4 个答案:

答案 0 :(得分:1)

您在服务器上执行此操作。他们第一次每天发出网络请求,总计增加100分。安全的客户端无法做到这一点。

答案 1 :(得分:0)

我建议您不要使用Shared Preferences来保存您想要的数据。他们可以修改它。

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

但是如果你想知道如何检查,那么你也可以使用Shared Preferences进行学习。

第1步:获取string的当前时间:

SimpleDateFormat sdf = new SimpleDateFormat("d-m-Y");
Calendar cal = Calendar.getInstance();
String dateInStr = sdf.format(cal.getTime());

步骤2:检查启动活动。 在onCreate()

之后
SharedPreferences pre=getSharedPreferences("my_sp", MODE_PRIVATE);
SharedPreferences.Editor edit=pre.edit();

if (pre.getBoolean(dateInStr, false)){
   //they checked today
}else{
  //not today
  // use check function here
  edit.putBoolean(dateInStr, true);
  edit.commit();
}

好的,将第1步代码放在第2步代码之后,我只将其分开以便于理解。

步骤3:您可以检查他们是否有超过1次检查点。如果这是他们结账当天的第一次,让我们加100点。

将此内容放在edit.putBoolean(dateInStr, true);

上方的其他语句中
//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);

答案 2 :(得分:0)

我可能迟迟未回答您的问题。.但是对于其他寻求奖励系统不希望服务器处理这些问题的人->

  

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

**。然后根据响应,可以奖励用户。

例如

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;
        }
    }

希望对您有所帮助!支持答案并祝您好运:)

答案 3 :(得分:0)

每当用户打开该应用程序时,请检查本地存储中是否有最后一个贷记日期,如果有,请确认当前日期比存储的日期多一个,然后您将该用户贷记第二天。

如果该日期在存储中不可用,则可以假定它是第一天。是的,您可以在此用例的MainActivity中完成此操作,因为您不会进行任何费时的api调用。

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