0

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

在此处输入图像描述

主 Activity 有一个来自 backendless.com 的方法,用于确定用户是否登录。它返回一个布尔语句并放在 Activity 的 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。然后用户登录并被带到第二个活动:

在此处输入图像描述 假设用户没有注销,只是关闭了应用程序。当他们重新启动它时,我需要应用程序从第二个 Activity 而不是登录屏幕开始。换句话说,是否有某种方法可以测试用户是否保持登录状态?我以为是上面的 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();
                }
            });

        }
    });
}}
4

3 回答 3

6

Backendless 已经使用 SharedPreferences 在应用重启之间存储数据。

因此,您需要在重新启动后检索用户。首先,您需要在登录时设置“stayLoggedIn”选项,如下所示 Backendless.UserService.login("login", "password", <callback>, true);:然后 Backendless 将您的用户 ID 和用户令牌存储在共享首选项中,以便在应用重启后可以访问。

要检查用户令牌是否有效,只需调用 Backendless.UserService.isValidLogin();

获取当前用户 objectId使用然后你Backendless.UserService.loggedInUser();可以使用普通对象获取用户Backendless.Data.findById(...)

我强烈不建议使用Backendless.UserService.CurrentUser(). 此方法不会从 SharedPreferences 检索用户,因此结果可能为空。它不检查用户是否登录,因此您可能会得到不一致的用户会话。Backendless 计划在未来改进其用户管理以摆脱这种方法。

于 2016-02-15T10:55:12.850 回答
1

只是为了完整。根据 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的讨论值得阅读以获取更多信息。

于 2016-06-03T00:33:05.853 回答
1

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

您也可以使用 BackEndless SDK 本身来完成。

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 }

我只是从这里的官方文档中复制了上面的代码。

于 2016-02-13T14:31:54.187 回答