我计划在我的Android应用程序中实现一个奖励系统,该应用程序的用户每天可以获得100分来打开应用程序。一旦他们打开应用程序,用户每天只能得到100分,无论多少次。我不知道如何做到这一点,例如,一个名为WhatsChat的应用程序,每天为用户提供打开应用程序的信用:
我正在尝试实施类似的系统,但每天只为用户提供100点打开应用程序。我知道我需要跟踪当天,并可能使用共享偏好将其存储在本地存储中,并记录每天的日期,然后将记录点数的变量增加100。
在伪代码中,它看起来像这样(我认为);
Set CreditsGained to 0
IF app launched for the first time on Current date THEN
CreditsGained = CreditsGained + 100
Else
Do nothing
请有人指导我如何在我的应用程序中实现此类系统。
答案 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调用。
我只是分享想法,找出代码。很简单。