时间检查每一秒钟,然后调整Ondesroy



我提出了免费获取不同促销代码的申请,但我想限制人们每5小时服用一次促销代码(即,单击"获取",获得促销代码和按钮不活动5个小时),但我遇到了一些问题:

  1. 如何设置每秒接收时间并在应用程序运行时准确计算差异(在代码中,仅当应用程序被最小化并在适当的时间之后部署应用程序时,它才能使用)?
  2. )?
  3. 当应用程序关闭时,如何保存.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();
    }
}

最新更新