2012-10-05 13 views
23

अभी मैं एक एंड्रॉइड एप्लिकेशन बनाने की कोशिश कर रहा हूं, मान लीजिए कि यह कुछ "एक्स" अवधारणा ठीक है। तो मैं एक लॉगिन स्क्रीन बना रहा हूँ। मैं जो करना चाहता हूं वह एक बार है जब मैंने अपने मोबाइल पर उस एप्लिकेशन में लॉग इन किया है, जब भी मैं उस एप्लिकेशन तक पहुंचने का प्रयास करता हूं तो इसे हमेशा लॉग इन होना चाहिए।एंड्रॉइड एप्लिकेशन को हमेशा राज्य में कैसे रखा जाए?

उदाहरण के लिए हमारे फेसबुक, जी-मेल और याहू आदि .. में हमारे मोबाइल फोन

उस के लिए क्या करें?

उत्तर

53

ऑटो लॉगिन कार्यक्षमता के लिए साझा प्राथमिकता का उपयोग करें। जब उपयोगकर्ता आपके एप्लिकेशन में लॉग इन करते हैं, तो लॉगिन स्थिति को साझा स्थिति में संग्रहीत करें और साझा करें जब उपयोगकर्ता लॉग आउट करते हैं तो साझा करें।

उपयोगकर्ता द्वारा साझा की गई प्राथमिकता से उपयोगकर्ता की स्थिति सही होने पर उपयोगकर्ता को एप्लिकेशन में प्रवेश करने पर हर बार जांचें, फिर लॉग इन पेज पर सीधे लॉग इन करने की आवश्यकता नहीं है।

इसे पहले प्राप्त करने के लिए कक्षा बनाएं, इस कक्षा में आपको साझा प्राथमिकता में प्राप्त करने और सेट मान के संबंध में सभी फ़ंक्शन लिखने की आवश्यकता है। कोड के नीचे कृपया इसे देखें।

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, ""); 
    } 
} 

अब मुख्य गतिविधि में ("गतिविधि" जहाँ उपयोगकर्ताओं को लॉग इन पुनः निर्देशित किया जाएगा) पहले प्रवेश गतिविधि में जाँच

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

यदि का उपयोग कर उपयोगकर्ता लॉगिन सफल तो सेट उपयोगकर्ता नाम setUserName() फ़ंक्शन ।

+0

आप कृपया मुझे कम से कम एक नमूना कार्यक्रम – Rohith

+0

भेज सकते हैं जब मैं यह कर और वापस प्रवेश करने का प्रयास है, यह रिटर्न शून्य – Sauron

+1

थाई बहुत असुरक्षित है, क्योंकि आप साझा किए गए प्राथमिकताओं को रूट किए गए फोन पर xml फ़ाइल के रूप में एक्सेस कर सकते हैं – Choletski

0

प्रवेश के बाद जब आप कॉल moveTaskToBack(true);

यह आपके आवेदन से वापस प्रेस पृष्ठभूमि राज्य में हो जाएगा। उम्मीद है

-1

सबसे पहले सफल लॉगिन के बाद, SharedPreferences में उपयोगकर्ता नाम/ईमेल और पासवर्ड सहेजें।

जब भी एप्लिकेशन शुरू होगा, कोड निष्पादित करें जो साझा किए गए पासवर्ड से उपयोगकर्ता नाम और पासवर्ड पुनर्प्राप्त करेगा और फिर इन दो मानों को एक विधि के पैरामीटर के रूप में पारित किया जा सकता है जो उपयोगकर्ता को प्रमाणित करेगा।

+0

आपको केवल कुकी या हैश या सत्र की पहचान करने की आवश्यकता है ... सादे दृष्टि में उपयोगकर्ता और पासवर्ड को सहेजना सुरक्षा के लिए अच्छा नहीं होगा ... – tyoc213

13

आप अपने SaveSharedPreference.java में लॉगआउट ऑपरेशन के लिए निम्नलिखित जोड़ सकते हैं:

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

हमेशा और जब भी ... इसलिए यह एक स्वचालित लॉगिन दृष्टिकोण की तरह लगता है। एप्लिकेशन शुरू होता है, उपयोगकर्ता को अपनी प्राधिकरण जानकारी प्रदान करने के बाद फिर से लॉगिन करने की आवश्यकता नहीं होती है। इसे प्राप्त करने के कई तरीके हैं। फेसबुक एपीआई उदा। फॉर्म तत्व के उपयोग के बिना लॉगिन के लिए तंत्र प्रदान करता है। तो आपको मूल रूप से एक ऐसा दृश्य बनाना होगा जिसमें उपयोगकर्ता एक बार अपनी प्राधिकरण जानकारी प्रदान कर सके, उन्हें साझा किए गए संदर्भों में संग्रहीत करें और अगली बार स्वचालित रूप से लॉगिन करें। भले ही ऐसा कोई एपीआई-आधारित लॉगिन न हो और आपको एक लॉगिन - फॉर्म प्रदान करना होगा, आप कभी-कभी लॉग-इन करने के लिए POST - अनुरोध अनुकरण कर सकते हैं। यह उस फ़ॉर्म के वास्तविक सर्वर-साइड कार्यान्वयन पर निर्भर करता है। लेकिन याद रखें: यह एक सुरक्षा समस्या है। इसलिए स्पष्ट टेक्स्ट प्रारूप में प्राधिकरण प्रमाण-पत्रों को कभी भी संग्रहित न करें। अपने आवेदन में परिभाषित कुंजी द्वारा इसे क्रिप्ट करने पर भरोसा न करें क्योंकि यह कुंजी आपके एपीके के रिवर्स इंजीनियरिंग द्वारा पता लगाया जा सकता है। इसके बजाए डिवाइस के बारे में कई सामूहिक सूचनाओं का उपयोग करें और उपयोगकर्ता को एक कुंजी दर्ज करना है या ऐप द्वारा यादृच्छिक रूप से जेनरेट और संग्रहित किया गया है।

1

साझा किए गए संदर्भों का उपयोग करना एंड्रॉइड में कुंजी-मूल्य जोड़ी डेटा को सहेजने और पुनर्प्राप्त करने का तरीका है और पूरे एप्लिकेशन में सत्र को रखने के लिए भी एक तरीका है।

SharedPreferences आप निम्नलिखित कदम उठाने की आवश्यकता के साथ काम करने के लिए: निर्माता को दो तर्क पारित करके

  1. शेयर SharedPreferences इंटरफ़ेस का प्रारंभ (स्ट्रिंग और पूर्णांक)

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

    // साझा किए गए संदर्भों को शुरू करना साझा किए गए संदर्भ pref = getAplicationContext()। 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", "लंबा मान"); // लंबे समय तक भंडारण

    editor.commit(); // प्रतिबद्ध परिवर्तन

  3. Retrieving Data

डाटा 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 
  1. अंत में, समाशोधन/लॉगआउट के मामले में की तरह डेटा को हटाने

आप साझा वरीयताओं आप निकालना कॉल कर सकते हैं ("KEY_NAME" से हटाना चाहते हैं) उस विशेष मूल्य को हटाने के लिए। आप सभी डेटा हटाना चाहते हैं, फोन स्पष्ट()

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(); 
    } 
} 
संबंधित मुद्दे