我使用backendless.com作为我的后端。我有一个登录主屏幕:
main活动有一个来自backendless.com的方法,用于确定用户是否已登录。它返回一个布尔语句,并放在活动的onCreate方法中:
AsyncCallback<Boolean> isValidLoginCallback = new AsyncCallback<Boolean>()
{
@Override
public void handleResponse( Boolean response )
{
Toast.makeText(getApplicationContext(), "Logged In: " + response, Toast.LENGTH_LONG).show();
}
@Override
public void handleFault( BackendlessFault fault )
{
Toast.makeText(getApplicationContext(), "An Issue Logging In", Toast.LENGTH_LONG).show();
}
};
当应用程序启动时,布尔值为false。然后用户登录并进入第二个活动:
假设用户没有注销,只是简单地关闭了应用程序。当他们重新启动它时,我需要应用程序从第二个活动开始,而不是登录屏幕。换句话说,是否有某种类型的方法可以测试用户是否保持登录状态?我原以为是上面的isValidLoginCallBack方法,然而,当我关闭应用程序并重新启动它时,布尔值再次为false。我猜这不是测试它的正确方法。我需要一些持久的东西。有人有什么建议吗?谢谢。
以下是第一个活动的完整代码:
public class MainActivity extends AppCompatActivity {
private EditText nameInput, passwordInput, emailInput;
private Button register, login;
String name, password, email;
BackendlessUser user = new BackendlessUser();
@Override
protected void onCreate(Bundle savedInstanceState) {
//NEED METHOD TO CHECK IF USER IS LOGGED IN.
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String appVersion = "v1";
Backendless.initApp(this, "Blah", "F63A6CC8-4F6E-997D-FF88-1E6ADABFC200", appVersion);
AsyncCallback<Boolean> isValidLoginCallback = new AsyncCallback<Boolean>()//THOUGHT THIS MIGHT BE IT BUT DOES NOT PERSIST
{
@Override
public void handleResponse( Boolean response )
{
Toast.makeText(getApplicationContext(), "Logged In: " + response, Toast.LENGTH_LONG).show();
}
@Override
public void handleFault( BackendlessFault fault )
{
Toast.makeText(getApplicationContext(), "An Issue Logging In", Toast.LENGTH_LONG).show();
}
};
Backendless.UserService.isValidLogin( isValidLoginCallback );
nameInput = (EditText)findViewById(R.id.nameInput);
passwordInput = (EditText)findViewById(R.id.passwordInput);
emailInput = (EditText)findViewById(R.id.emailInput);
register = (Button) findViewById(R.id.buttonRegister);
login = (Button) findViewById(R.id.buttonLogin);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
name = nameInput.getText().toString();
password = passwordInput.getText().toString();
email = emailInput.getText().toString();
user.setEmail(email);
user.setProperty("name", name);
user.setPassword(password);
Backendless.UserService.register(user, new AsyncCallback<BackendlessUser>() {
public void handleResponse(BackendlessUser registeredUser) {
Toast.makeText(getApplicationContext(), "Registered!", Toast.LENGTH_LONG).show();
}
public void handleFault(BackendlessFault fault) {
Toast.makeText(getApplicationContext(), "Not Registered!" + fault, Toast.LENGTH_LONG).show();
}
});
}
});
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
email = emailInput.getText().toString();
password = passwordInput.getText().toString();
Backendless.UserService.login(email, password, new AsyncCallback<BackendlessUser>() {
public void handleResponse(BackendlessUser user) {
Toast.makeText(getApplicationContext(), "Logged In!", Toast.LENGTH_LONG).show();
Intent i = new Intent(MainActivity.this, ActivityTwo.class);
startActivity(i);
finish();
}
public void handleFault(BackendlessFault fault) {
Toast.makeText(getApplicationContext(), "No Name", Toast.LENGTH_LONG).show();
}
});
}
});
}}
发布于 2016-02-15 18:55:13
Backendless已经使用SharedPreferences在应用程序重启之间存储数据。
因此,您需要在重新启动后检索用户。首先,您需要在登录时设置"stayLoggedIn“选项:Backendless.UserService.login("login", "password", <callback>, true);
。然后Backendless将你的用户ID和用户token存储在共享首选项中,这样在应用程序重启后就可以访问它们了。
要检查用户令牌是否有效,只需调用Backendless.UserService.isValidLogin();
使用Backendless.UserService.loggedInUser();
获取当前用户objectId,然后可以使用Backendless.Data.findById(...)
抓取用户作为普通对象。
我强烈建议不要使用Backendless.UserService.CurrentUser()
。此方法不从SharedPreferences检索用户,因此结果可能为空。它不会检查用户是否登录,因此您可能会得到不一致用户会话。Backendless正计划在未来改进其用户管理,以摆脱这种方法。
发布于 2016-02-13 22:31:54
您可以使用SharedPrefernces。即使用户关闭了应用程序,将数据存储在共享首选项中也是持久的。这是一个tutorial。
您也可以使用BackEndless软件开发工具包本身来完成此操作。
public void Backendless.UserService.login( String login,
String password,
boolean stayLoggedIn,
AsyncCallback<BackendlessUser> callback );
在这里,stayLoggedIn请求存储用户的登录信息,以便下次用户启动应用程序时可以跳过登录表单。使用以下API检查应用程序是否具有以前运行的用户登录信息:
// UserTokenStorageFactory is available in the com.backendless.persistence.local package
String userToken = UserTokenStorageFactory.instance().getStorage().get();
if( userToken != null && !userToken.equals( "" ) )
{ // user login is available, skip the login activity/login form }
我只是从官方文档here中复制了上面的代码。
发布于 2016-06-03 08:33:06
只是为了完整。基于schaffe的答案,这是正确的,但方法并不完全准确,我想出了一个对我有效的解决方案。
if (Backendless.UserService.isValidLogin()) {
String userId = Backendless.UserService.loggedInUser();
BackendlessUser user = Backendless.UserService.findById(userId);
if (backendlessUser != null) {
// Your user is logged in.
}
在Backendless上有一个值得阅读的讨论,以获取更多信息。
https://stackoverflow.com/questions/35381083
复制相似问题