即使应用程序关闭,我如何临时禁用按钮?

即使应用程序关闭,我如何临时禁用按钮?

问题描述:

所以我创建了一个简单的登录活动。当用户登录失败3次后,登录按钮将被禁用一段时间。即使应用程序关闭,我如何临时禁用按钮?

我的努力是当我关闭应用程序并再次打开时,按钮被启用。如何解决这个问题?

这里是我的代码:

public class LoginControl extends Activity { 
private DBControl db = new DBControl(this); 
int counter = 2; 
Button login = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.loginview); 


    Button register = (Button) findViewById(R.id.btnCreateA); 
    login = (Button) findViewById(R.id.btnLogin); 
    login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       EditText a = (EditText) findViewById(R.id.etUser); 
       EditText b = (EditText) findViewById(R.id.etPassword); 
       String user = a.getText().toString(); 
       String pass = b.getText().toString(); 
       String confirm = db.getUserPass(user); 
       if (user.equals("") || pass.equals("")) { 
        Toast passed = Toast.makeText(LoginControl.this, "Please input required fields.", Toast.LENGTH_LONG); 
        passed.show(); 
       } else if (pass.equals(confirm)) { 
        Toast passed = Toast.makeText(LoginControl.this, "Sucess!", Toast.LENGTH_LONG); 
        passed.show(); 
        Intent intent = new Intent(LoginControl.this, HomeControl.class).putExtra("Music", false); 
        startActivity(intent); 
        finish(); 

       } else if (counter == 0) 
       // Disable button after 3 failed attempts 
       { 

        login.setEnabled(false); 

        Toast alert = Toast.makeText(LoginControl.this, "Login Disabled for 5 mins", Toast.LENGTH_LONG); 
        alert.show(); 

        final Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          login.setEnabled(true); 
          counter = 2; 
         } 
        }, 30000); 
       } else { 
        Toast passed = Toast.makeText(LoginControl.this, "Username or password don't match!", Toast.LENGTH_LONG); 
        counter--; 
        passed.show(); 
       } 
      } catch (Exception e) { 
       Toast passed = Toast.makeText(LoginControl.this, e.toString(), Toast.LENGTH_LONG); 
       passed.show(); 
      } 
     } 
    }); 
} 

}

使用共享偏好,保存按钮的状态login.setEnabled(false)后:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE); 
boolean enabled = login.isEnabled(); 
prefs.edit().putBoolean("LOGIN_ENABLED_KEY", enabled).apply(); 

就在onCreate得到login按钮暂停状态之后,检查此值的存在(使用true为默认值) :

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE); 
boolean enabled = prefs.getBoolean("LOGIN_ENABLED_KEY", true); 
login.setEnabled(enabled); 

如果按钮是在这一点上禁用,您需要重新启动定时器,使得它最终被启用:

if (!enabled) { 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      login.setEnabled(true); 
      prefs.edit().clear().apply(); 
      counter = 2; 
     } 
    }, 30000); 
} 

当经过计时器:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE); 
prefs.edit().putBoolean("LOGIN_ENABLED_KEY", true).apply(); 

或者,只是清除共享偏好:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE); 
prefs.edit().clear().apply(); 

全部放在一起,事情大致是这样的:

int counter = 2; 
Button login = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.loginview); 

    final SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE); 
    login = (Button) findViewById(R.id.btnLogin); 
    boolean enabled = prefs.getBoolean("LOGIN_ENABLED_KEY", true); 
    login.setEnabled(enabled); 
    if (!enabled) { 
     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       login.setEnabled(true); 
       prefs.edit().clear().apply(); 
       counter = 2; 
      } 
     }, 30000); 
    } 

    login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       EditText a = (EditText) findViewById(R.id.etUser); 
       EditText b = (EditText) findViewById(R.id.etPassword); 
       String user = a.getText().toString(); 
       String pass = b.getText().toString(); 
       if (user.equals("") || pass.equals("")) { 
        Toast passed = Toast.makeText(LoginControl.this, "Please input required fields.", Toast.LENGTH_LONG); 
        passed.show(); 
       } else if (pass.equals("pass")) { 
        Toast passed = Toast.makeText(LoginControl.this, "Success!", Toast.LENGTH_LONG); 
        passed.show(); 
        // Start HomeControl + finish() 
       } else if (counter == 0) { 
        // Disable button after 3 failed attempts 
        login.setEnabled(false); 
        prefs.edit().putBoolean("LOGIN_ENABLED_KEY", false).apply(); 
        Toast alert = Toast.makeText(LoginControl.this, "Login Disabled for 5 mins", Toast.LENGTH_LONG); 
        alert.show(); 

        final Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          login.setEnabled(true); 
          prefs.edit().clear().apply(); 
          counter = 2; 
         } 
        }, 30000); 
       } else { 
        Toast passed = Toast.makeText(LoginControl.this, "Username or password don't match!", Toast.LENGTH_LONG); 
        counter--; 
        passed.show(); 
       } 
      } catch (Exception e) { 
       Toast passed = Toast.makeText(LoginControl.this, e.toString(), Toast.LENGTH_LONG); 
       passed.show(); 
      } 
     } 
    }); 
} 

(这里显然有一些重构的空间,但这是有效的。)

+0

这当然会禁用按钮,但仍然存在问题。 即使时间流逝,按钮也不会回到启用模式。 –

+0

请参阅编辑 - 您只需要保持“true”而不是“false”,或者只需重置您的共享首选项,以便下次绕过它时使用后备('true')值。 –

+0

我仍然不太喜欢共享首选项。请问我应该在哪一行放置该代码? –

为了得到这个信息,即使该应用程序重新启动,你需要保存的时间时,按钮将被重新启用。当您的应用程序启动时,您可以打开这些信息,并检查它是在此之前还是之后。

有几种方法,你怎么可以存储在Android上的信息:

为了您的问题我建议你应该使用Shared Preferences。