我申请免费获取不同的促销代码,但我想限制人们每5小时获取一次促销代码(即,单击“获取”,获取促销代码,并且该按钮在5天内无效)小时),但遇到了两个问题:
在关闭应用程序时如何保存.setEnabled()按钮的值(是或否)(我知道在OnDestroy中,但是我找不到要查找的命令)? 预先感谢!
Button button;
TextView textView;
private String TAG;
SharedPreferences preferences;
Long oldTime;
Long newTime;
Long current;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
preferences = PreferenceManager.getDefaultSharedPreferences(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button.setEnabled(false);
Date date = new Date();
long startTime = date.getTime();
Log.d(TAG,"Time: " + startTime);
SharedPreferences.Editor editor = preferences.edit();
editor.putLong("Tl", startTime);
editor.apply();
oldTime = preferences.getLong("Tl", 0);
Log.d(TAG, "Old Time2: " + oldTime);
newTime = System.currentTimeMillis();
Log.d(TAG, "New Time: " + newTime);
current = newTime - oldTime;
Log.d(TAG, "Current: " + current);
}
});
if (current != null) {
if (current >= 10000) {
button.setEnabled(true);
}
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onRestart() {
super.onRestart();
oldTime = preferences.getLong("Tl", 0);
Log.d(TAG, "Old Time2: " + oldTime);
newTime = System.currentTimeMillis();
Log.d(TAG, "New Time: " + newTime);
current = newTime - oldTime;
Log.d(TAG, "Current: " + current);
if (current >= 10000) {
button.setEnabled(true);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
button.onSaveInstanceState();
}
答案 0 :(得分:2)
如何设置每秒接收时间并计算 应用程序运行时的确切差异(在代码中 仅在最小化应用程序且应用程序为 在合适的时间部署)?
无需每秒检查以启用/禁用获取升级代码按钮。如果您需要在特定时间(以您的情况为5个小时)之后执行某个操作(启用/禁用按钮),则应该使用AlarmManager
API。无论您的应用程序是否运行,它都将起作用。
解决方案:您可以按照以下示例在特定时间后执行操作。
步骤1:定义AlarmBroadcastReceiver
类,AlarmManager
将在特定时间后调用该类。
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext())
.edit()
.putBoolean("enabled", true)
.apply();
Intent i = new Intent("updatePromoteCode");
LocalBroadcastManager.getInstance(context).sendBroadcast(i);
}
}
然后在清单文件中注册。
<receiver android:name=".AlarmBroadcastReceiver"/>
步骤2:在MainActivity
中编写代码,其布局只有一个名为button_get_promote_code
的按钮。
public class MainActivity extends AppCompatActivity {
private static final int PROMOTE_CODE_AVAILABLE_INTERVAL = 5 * 60 * 60 * 1000; // In milliseconds.
private AlarmManager mAlarmManager;
private Button mGetPromoteCodeButton;
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Enable the button after the specific time.
mGetPromoteCodeButton.setEnabled(true);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
mGetPromoteCodeButton = findViewById(R.id.button_get_promote_code);
mGetPromoteCodeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Disable the button after users click on it.
v.setEnabled(false);
// Save a variable named `enabled` in prefs which indicates status of the button.
PreferenceManager.getDefaultSharedPreferences(MainActivity.this.getApplicationContext())
.edit()
.putBoolean("enabled", false)
.apply();
// Schedule an action (enable the button) after a specific time by using AlarmManager.
mAlarmManager.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + PROMOTE_CODE_AVAILABLE_INTERVAL,
pendingIntent);
}
});
}
@Override
protected void onStart() {
super.onStart();
// This receiver will receive an action which sent from `onReceive` method of `AlarmBroadcastReceiver`.
IntentFilter intentFilter = new IntentFilter("updatePromoteCode");
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, intentFilter);
// When this activity goes to foreground, we will set its status based on `enabled` variable in prefs.
boolean enabled = PreferenceManager.getDefaultSharedPreferences(MainActivity.this.getApplicationContext())
.getBoolean("enabled", true);
mGetPromoteCodeButton.setEnabled(enabled);
}
@Override
protected void onStop() {
// Unregister the receiver.
LocalBroadcastManager.getInstance(this).unregisterReceiver(mBroadcastReceiver);
super.onStop();
}
}