2012-10-05 108 views
23

現在我正在嘗試創建一個Android應用程序,假設它將會是一些「X」概念還好。所以我正在創建一個登錄屏幕。我想要做的就是立即在移動設備上登錄該應用程序時,只要我嘗試訪問該應用程序,就應該始終登錄該應用程序。如何讓android應用程序始終處於登錄狀態?

例如我們的Facebook,G郵箱和雅虎等。在我們的手機

什麼該怎麼辦?

回答

53

使用共享首選項進行自動登錄功能。當用戶登錄到您的應用程序時,請將登錄狀態存儲到sharedPreference中,並在用戶註銷時清除sharedPreference。

檢查每次當用戶進入應用程序,如果從共享偏好用戶狀態爲真,則無需再次登錄,否則直接到登錄頁面的時間。

爲了實現這一目標首先要創建一個類,這個類,你需要寫的所有關於在sharedpreference get和set值的功能。請看下面的代碼。

public class SaveSharedPreference 
{ 
    static final String PREF_USER_NAME= "username"; 

    static SharedPreferences getSharedPreferences(Context ctx) { 
     return PreferenceManager.getDefaultSharedPreferences(ctx); 
    } 

    public static void setUserName(Context ctx, String userName) 
    { 
     Editor editor = getSharedPreferences(ctx).edit(); 
     editor.putString(PREF_USER_NAME, userName); 
     editor.commit(); 
    } 

    public static String getUserName(Context ctx) 
    { 
     return getSharedPreferences(ctx).getString(PREF_USER_NAME, ""); 
    } 
} 

現在的主要活動(「活動」,其中登錄時,用戶會被重定向)如果使用setUserName()函數,用戶登錄成功,則設置用戶名先檢查

if(SaveSharedPreference.getUserName(MainActivity.this).length() == 0) 
{ 
    // call Login Activity 
} 
else 
{ 
    // Stay at the current activity. 
} 

在登錄活動。

+0

能否請你給我ATLEAST一個示例程序 – Rohith

+0

當我做到這一點,並嘗試重新登錄,它返回null – Sauron

+1

thi是非常不安全的,因爲您可以在根用電話上訪問共享首選項作爲xml文件 – Choletski

0

登錄後,當您按下回來從這個應用程序中調用moveTaskToBack(true);

會在後臺狀態。希望幫助

-1

成功登錄後首先,保存的用戶名/電子郵件和密碼SharedPreferences

每當應用程序將啓動,執行代碼,用於將檢索sharedPrefernces的用戶名和密碼,然後這兩個值可以作爲參數來將所述用戶認證的方法來傳遞。

+0

您只需要保存cookie或散列或標識會話的內容......將用戶和密碼保存在明顯的位置不會有利於安全... – tyoc213

13

您可能會增加對註銷操作下在SaveSharedPreference.java:

public static void clearUserName(Context ctx) 
{ 
    Editor editor = getSharedPreferences(ctx).edit(); 
    editor.clear(); //clear all stored data 
    editor.commit(); 
} 
6

始終每當...所以這似乎是一個自動登錄的方法。 應用程序啓動後,用戶在提供授權信息後不必再次登錄。有幾種方法可以實現這一點。 Facebook API例如提供了不使用表單元素的登錄機制。 因此,您基本上必須構建一個視圖,在該視圖中用戶可以提供一次授權信息,將它們存儲在SharedPreferences中,並在下次自動登錄。 即使沒有這樣的基於API的登錄,並且您必須使用提供的登錄表單,您有時也可以模擬POST請求登錄。這取決於該表單的實際服務器端實現。 但請記住:這是一個安全問題。因此絕不要以明文形式存儲授權憑證。不要依靠應用程序中定義的密鑰來加密,因爲通過對APK進行反向工程可以檢測到此密鑰。而是使用許多關於設備的集體信息以及用戶必須輸入的密鑰或由應用程序隨機生成並存儲的密鑰。

1

使用SharedPreferences是一種在Android中保存和檢索鍵值對數據並在整個應用程序中保持會話的方法。

不同,需要採取以下步驟SharedPreferences工作:通過傳遞兩個參數的構造

  1. 份額SharedPreferences接口的初始化階段(字符串和整數)

    // Sharedpref file name 
    private static final String PREF_NAME = "PreName"; 
    // Shared pref mode 
    int PRIVATE_MODE = 0; 
    

    //初始化SharedPreferences SharedPreferences pref = getApplicationContext()。getSharedPreferences(「MyPref」,0); // 0 - 用於私人模式

  2. 使用編輯器界面和它的方法來修改SharedPreferences值和用於存儲數據供將來檢索

    //Initialising the Editor 
        Editor editor = pref.edit(); 
        editor.putBoolean("key_name", true); // Storing boolean - true/false 
    

    editor.putString(「KEY_NAME」,「字符串值」) ; //存儲字符串 editor.putInt(「key_name」,「int value」); //存儲整數 editor.putFloat(「key_name」,「float value」); //存儲浮點數 editor.putLong(「key_name」,「long value」); //長存

    editor.commit(); //提交更改

  3. 檢索數據

數據可以從保存的喜好通過調用的getString()(對於字符串)方法來提取。請記住,此方法應在共享首選項上調用,而不是在編輯器上調用

// returns stored preference value 
    // If value is not present return second param value - In this case null 
    pref.getString("key_name", null); // getting String 
    pref.getInt("key_name", null); // getting Integer 
    pref.getFloat("key_name", null); // getting Float 
    pref.getLong("key_name", null); // getting Long 
    pref.getBoolean("key_name", null); // getting boolean 
  • 最後,清除/在註銷的情況下,刪除等數據
  • 如果你想從共享偏好可以調用刪除(「KEY_NAME」刪除)刪除該特定值。如果你想刪除所有數據,調用clear()

    editor.remove("name"); // will delete key name 
    editor.remove("email"); // will delete key email 
    
    editor.commit(); // commit changes 
    
    Following will clear all the data from shared preferences 
    editor.clear(); 
    editor.commit(); // commit changes 
    

    請按照下面的鏈接下載一個簡單明瞭的例子: http://www.androidhive.info/2012/08/android-session-management-using-shared-preferences/

    我希望我沒有違背規則和分享此鏈接的平臺的法規。

    //This is my SharedPreferences Class 
        import java.util.HashMap; 
    import android.annotation.SuppressLint; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.SharedPreferences; 
    import android.content.SharedPreferences.Editor; 
    
    public class SessionManager { 
        // Shared Preferences 
        SharedPreferences pref; 
        // Editor for Shared preferences 
        Editor editor; 
        // Context 
        Context _context; 
        // Shared pref mode 
        int PRIVATE_MODE = 0; 
        // Sharedpref file name 
        private static final String PREF_NAME = "AndroidHivePref"; 
        // All Shared Preferences Keys 
        private static final String IS_LOGIN = "IsLoggedIn"; 
        // User name (make variable public to access from outside) 
        public static final String KEY_NAME = "name"; 
        // Email address (make variable public to access from outside) 
        public static final String KEY_EMAIL = "email"; 
    
        // Constructor 
        @SuppressLint("CommitPrefEdits") 
        public SessionManager(Context context) { 
         this._context = context; 
         pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
         editor = pref.edit(); 
        } 
    
        /** 
        * Create login session 
        */ 
        public void createLoginSession(String name, String email) { 
         // Storing login value as TRUE 
         editor.putBoolean(IS_LOGIN, true); 
         // Storing name in pref 
         editor.putString(KEY_NAME, name); 
         // Storing email in pref 
         editor.putString(KEY_EMAIL, email); 
         // commit changes 
         editor.commit(); 
        } 
    
        /** 
        * Check login method wil check user login status If false it will redirect 
        * user to login page Else won't do anything 
        */ 
        public void checkLogin() { 
         // Check login status 
         if (!this.isLoggedIn()) { 
          // user is not logged in redirect him to Login Activity 
          Intent i = new Intent(_context, MainActivity.class); 
          // Closing all the Activities 
          i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    
          // Add new Flag to start new Activity 
          i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    
          // Staring Login Activity 
          _context.startActivity(i); 
         } 
    
        } 
    
        /** 
        * Get stored session data 
        */ 
        public HashMap<String, String> getUserDetails() { 
         HashMap<String, String> user = new HashMap<String, String>(); 
         // user name 
         user.put(KEY_NAME, pref.getString(KEY_NAME, null)); 
    
         // user email id 
         user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null)); 
    
         // return user 
         return user; 
        } 
    
        /** 
        * Clear session details 
        */ 
        public void logoutUser() { 
         // Clearing all data from Shared Preferences 
         editor.clear(); 
         editor.commit(); 
    
         // After logout redirect user to Loing Activity 
         Intent i = new Intent(_context, MainActivity.class); 
         // Closing all the Activities 
         i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    
         // Add new Flag to start new Activity 
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    
         // Staring Login Activity 
         _context.startActivity(i); 
        } 
    
        /** 
        * Quick check for login 
        **/ 
        // Get Login State 
        public boolean isLoggedIn() { 
         return pref.getBoolean(IS_LOGIN, false); 
        } 
    } 
    
    
    Finally, you will have to create an instance of this SessionManager class in the onCreate method of your activity class and then call the createLoginSession for the session that will be used throughout the entire session 
    
    
    
    // Session Manager Class 
        SessionManager session; 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         // Session Manager 
         session = new SessionManager(getApplicationContext()); 
    session.createLoginSession("Username", intentValue); 
    } 
    

    我希望它有幫助。

    0

    Xamarin.Android端口奇拉格拉瓦爾的和LINTUism的答案:

    public class SharedPreference 
    { 
        static ISharedPreferences get(Context ctx) 
        { 
         return PreferenceManager.GetDefaultSharedPreferences(ctx); 
        } 
    
        public static void SetUsername(Context ctx, string username) 
        { 
         var editor = get(ctx).Edit(); 
         editor.PutString("USERNAME", username); 
         editor.Commit(); 
        } 
    
        public static string GetUsername(Context ctx) 
        { 
         return get(ctx).GetString("USERNAME", ""); 
        } 
    
        public static void Clear(Context ctx) 
        { 
         var editor = get(ctx).Edit(); 
         editor.Clear(); 
         editor.Commit(); 
        } 
    } 
    
    相關問題