我提出了免费获取不同促销代码的申请,但我想限制人们每5小时服用一次促销代码(即,单击"获取",获得促销代码和按钮不活动5个小时),但我遇到了一些问题:
- 如何设置每秒接收时间并在应用程序运行时准确计算差异(在代码中,仅当应用程序被最小化并在适当的时间之后部署应用程序时,它才能使用)? )?
当应用程序关闭时,如何保存.setEnabled()按钮(true或fals)的值(我知道在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(); }
如何设置每秒接收时间并计算 应用程序运行时的确切区别(在代码中 仅当将应用程序最小化并且应用程序是 在适当的时间后部署)?
无需检查每一秒即可启用/禁用升级代码按钮。如果您需要在特定时间(在情况下为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();
}
}