首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BackEndless -测试用户是否仍在登录

BackEndless -测试用户是否仍在登录
EN

Stack Overflow用户
提问于 2016-02-13 22:24:47
回答 3查看 1.7K关注 0票数 0

我使用backendless.com作为我的后端。我有一个登录主屏幕:

main活动有一个来自backendless.com的方法,用于确定用户是否已登录。它返回一个布尔语句,并放在活动的onCreate方法中:

代码语言:javascript
运行
复制
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。我猜这不是测试它的正确方法。我需要一些持久的东西。有人有什么建议吗?谢谢。

以下是第一个活动的完整代码:

代码语言:javascript
运行
复制
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();
                }
            });

        }
    });
}}
EN

回答 3

Stack Overflow用户

发布于 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正计划在未来改进其用户管理,以摆脱这种方法。

票数 6
EN

Stack Overflow用户

发布于 2016-02-13 22:31:54

您可以使用SharedPrefernces。即使用户关闭了应用程序,将数据存储在共享首选项中也是持久的。这是一个tutorial

您也可以使用BackEndless软件开发工具包本身来完成此操作。

代码语言:javascript
运行
复制
public void Backendless.UserService.login( String login, 
                                      String password, 
                                      boolean stayLoggedIn, 
                                      AsyncCallback<BackendlessUser> callback );

在这里,stayLoggedIn请求存储用户的登录信息,以便下次用户启动应用程序时可以跳过登录表单。使用以下API检查应用程序是否具有以前运行的用户登录信息:

代码语言:javascript
运行
复制
// 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中复制了上面的代码。

票数 1
EN

Stack Overflow用户

发布于 2016-06-03 08:33:06

只是为了完整。基于schaffe的答案,这是正确的,但方法并不完全准确,我想出了一个对我有效的解决方案。

代码语言:javascript
运行
复制
 if (Backendless.UserService.isValidLogin()) {
      String userId = Backendless.UserService.loggedInUser();
      BackendlessUser user = Backendless.UserService.findById(userId);
      if (backendlessUser != null) {
           // Your user is logged in.
      }

Backendless上有一个值得阅读的讨论,以获取更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35381083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档