每秒检查一次并调整OnDesroy

时间:2019-03-11 21:11:33

标签: android

我申请免费获取不同的促销代码,但我想限制人们每5小时获取一次促销代码(即,单击“获取”,获取促销代码,并且该按钮在5天内无效)小时),但遇到了两个问题:

  1. 如何设置为每秒钟接收一次时间,并准确计算应用程序运行时的时间差(在代码中,只有将应用程序最小化并在正确的时间后部署应用程序,它才起作用)?
  2. 在关闭应用程序时如何保存.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();
    
    }
    

1 个答案:

答案 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();
    }
}