以下是一个示例,我希望能够在用户操作后的有限时间内(比如30分钟)在我的应用中启用按钮。 30分钟后,此按钮将再次被禁用。 在android中实现这一目标的最佳方法是什么?
因为用户可能会重启设备或关闭应用程序,所以我不能简单地使用倒数计时器。即便如此,鉴于有一个特定的时间间隔开始结束日期,我可以简单地检查当前时间,看看按钮的状态应该是什么。但是,用户可以简单地将手机的日期放回15分钟,这样按钮就会继续启用。
答案 0 :(得分:2)
您可以使用Handler的postDelayed方法。见下文 -
//when use press button
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//disable your button here
}
}, 3*1000); //your delay time
希望有所帮助。
答案 1 :(得分:1)
例如,您可以每分钟使用倒数计时器,然后将该进度保存在配置文件中。当用户有30分钟时,您可以禁用该按钮。 您可以将配置文件写入用户无法触摸的应用程序内部文件夹中。 如果用户在7分钟内关闭应用程序,则在配置文件中存在这7分钟。如果用户把电话的日期放回去并不关心;)
答案 2 :(得分:1)
这里最好的办法是使用CountDown计时器,在 PreferenceHelper 中写入按钮启用时间的进度。 定义一个间隔,比如30秒或1分钟,并在用户操作完成后立即触发此倒计时器。
每30秒后或每1分钟后,根据您选择的间隔更新首选助手中的值。
更新间隔为1分钟的示例
public void updateButtonDisableTimer(){
SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
int oldTimerValue = sharedpreferences.getInt("key", 0); // is the default value in case no value is found.
Editor editor = sharedpreferences.edit();
if(oldTimerValue > 30){
//this the case when you need to stop the timer
editor.putInt("key", 0);
//Write code to disable the button
}else{
int newValue = oldTimerValue + 1; //1 min is interval
editor.putInt("key", newValue);
}
editor.commit();
}
这将适用于app关闭和所有其他方案。只有在清除数据时它才会失败。希望它有效:)
答案 3 :(得分:1)
鉴于有一个特定的时间间隔开始结束日期,我可以 只需检查当前时间,看看状态如何 按钮应该是。但是,用户可以简单地说出手机的日期 回来15分钟,这样按钮就会继续启用。
要避免这种情况,请设置AlarmManager
因为用户可能会重启设备或关闭应用
关闭应用程序一旦设置就不会对AlarmManager产生任何影响。但是,重新启动。还有ways重新创建AlarmManager。简而言之,您可以再次创建AlarmManager。但它对之前设定的时间没有任何线索。实现此目的的一种方法是,将时间存储在共享首选项中,同时设置AlarmManager。现在您可以根据需要多次触发AlarmManager,因为您知道目标时间。
一旦AlarmManager触发,只需从Pending Intent提供的活动/服务中启用/禁用相关按钮。
答案 4 :(得分:0)
正常情况
AlarmManager
,它将唤醒并清除共享首选项并禁用按钮状态。案例,当用户关闭并打开应用
时用户更改时间的情况
AndroidManifest
(see how)中注册时间更改事件,并根据时间的变化对SharedPreferences
执行必要的操作。显然,如果用户清除应用程序的数据,这种技术是无用的,你必须执行后端同步(Firebase Database也许??)。
答案 5 :(得分:0)
使用System.currentTimeMillis()
在首选项开始时保存,每次检查当前时间(相同System.currentTimeMillis()
)是否超过30分钟。
答案 6 :(得分:0)
使用以下代码禁用该按钮30分钟。 btn.setEnabled(假);
new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(1800000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LoginActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setEnabled(true);
}
});
}
}).start();
答案 7 :(得分:0)
OnClick按钮存储sharedPreference中的当前时间。 当你回来时检查当前时间和sharedPref时间之间的差异。 如果超过30分钟,则启用其他禁用。 对于第一个sharedPreference值,此时启用按钮
为null答案 8 :(得分:0)
我会用以下方式评估这个问题: