2016-02-13 57 views
0

我正在使用backendless.com作爲我的後端。我有一個登錄主屏幕。BackEndless - 測試用戶是否仍然登錄

enter image description here

主要活動有來自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。用戶然後登錄並被帶到第二活動:

enter image description here 假設用戶不註銷並簡單地關閉應用程序。當他們重新啓動它時,我需要應用程序以第二個活動開始,而不是登錄屏幕。換句話說,是否有某種類型的方法來測試用戶是否仍然登錄?我認爲這將是上面的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(); 
       } 
      }); 

     } 
    }); 
}} 

回答

1

您可以使用SharedPrefernces。即使用戶關閉應用程序,將數據存儲在共享偏好設置中也將保持不變。這是一個tutorial

您也可以使用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 } 

我剛剛從官方文檔here複製上面的代碼。

+0

我想知道更多,所以如果有人知道backendless.com已經提供來處理這個API的API。 –

5

Backendless已經使用SharedPreferences在應用程序重新啓動之間存儲數據。

因此,您需要在重新啓動後檢索用戶。首先,您需要在登錄時設置「stayLoggedIn」選項,如下所示: Backendless.UserService.login("login", "password", <callback>, true);。然後Backendless將您的用戶標識和用戶標識存儲在共享的首選項中,以便在應用程序重新啓動後變爲可訪問。

要檢查用戶令牌是否有效就叫 Backendless.UserService.isValidLogin();

獲取當前用戶OBJECTID使用Backendless.UserService.loggedInUser();然後你可以抓住用戶的使用Backendless.Data.findById(...)普通對象。

我強烈不建議使用Backendless.UserService.CurrentUser()。此方法不會從SharedPreferences中檢索用戶,因此結果可能爲空。它不檢查用戶是否登錄,所以你可能會得到不一致的用戶會話。 Backendless計劃在未來改善其用戶管理,以擺脫這種方法。

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的討論值得閱讀以獲取更多信息。