2013-08-13 8 views
5

के साथ ऐप प्रवाह मैं अपनी ऐप संरचना के साथ थोड़ी देर के लिए संघर्ष कर रहा हूं। और यह वास्तव में ऐसा लगता है कि इस संरचना ने मुझे अन्य सुविधाओं के विकास में बहुत दर्द दिया है। तो आगे जाने से पहले मैं कुछ सलाह लेना चाहता हूं और देख रहा हूं कि मैं यहां कुछ गलत कर रहा हूं या नहीं।खाता प्रबंधक

मेरा ऐप का उद्देश्य किसी सर्वर से कनेक्ट करना है, मैं डिवाइस पर खाता बनाने के लिए खाता प्रबंधक तंत्र का उपयोग करता हूं और सर्वर से डेटा का अनुरोध करने के लिए उपयोग किए जाने वाले टोकन को संग्रहीत करता हूं। खाते के निर्माण में, सबकुछ ठीक है। (यह उपकरण सेटिंग से और साथ काम करता है -> कोई खाता जोड़ने)

यह इस प्रकार है:

MainActivity गतिविधि है कि, जब आप एप्लिकेशन लॉन्च देखें कि आपको कोई खाता है तो है। यदि आपके पास खाता है, तो मुझे एक स्थिर चर में टोकन मिलता है ताकि मुख्य गतिविधि में प्रत्येक खंड इसे एक्सेस कर सके। (काम करने के लिए माना जाता है लेकिन नहीं) अन्यथा, मैं डिवाइस पर खाता बनाने के लिए लॉगिन एक्टिविटी के साथ एक इरादा बना देता हूं। समस्या यह है कि मेरे टुकड़े इस टोकन को नहीं प्राप्त कर सकते हैं क्योंकि, क्योंकि मैं AccountManager.getAuthToken() का उपयोग करके थ्रेड में टोकन पुनर्प्राप्त कर रहा हूं, इस टोकन को पुनर्प्राप्त करने से पहले टुकड़े बनाए जाते हैं। और इसलिए मैं अपने सर्वर से डेटा का अनुरोध नहीं कर सकता।

कौन सा मुझे लगता है कि मेरे ऐप संरचना है कि अच्छा नहीं हो सकता है का नेतृत्व किया। तो मैं सोच रहा था, "अगर मुझे ऐसा लगता है तो क्या होगा?" :

  • उपयोगकर्ता एक बूटस्ट्रैप जो खाते के लिए जाँच करें और वहाँ डिवाइस पर एक खाता है, तो टोकन प्राप्त लेकिन वर्तमान संस्करण की तरह देखने के किसी भी प्रकार उत्पन्न नहीं है एप्लिकेशन
  • MainActivity कार्य की शुरूआत।
  • MainActivity या तो LoginActivity या ContentActivity को अनुप्रेषित (के इसे उस तरह से संपर्क कर सकें, एक गतिविधि है कि मेरे टोकन का उपयोग करने के लिए अपने listviews में डेटा को भरने के लिए चाहिए था)

इस तरह मुझे लगता है कि MainActivity को टोकन होगा की सुविधा देता है पास करें लेकिन मुझे यकीन नहीं है कि यह यूएक्स के मामले में आदर्श है। (सामग्री तक पहुंचने से पहले टोकन के लिए इंतजार करना होगा)। मैं इस बिंदु पर हर सुझाव के लिए खुला हूं क्योंकि मैं वास्तव में अटक गया हूं।

धन्यवाद!

अद्यतन 1:

यह खाता प्रबंधक से निपटने की तुलना में प्रवेश करें/पंजीकरण एप्लिकेशन तर्क की अधिक है। मैंने उन्हें काम करने में कामयाब रहा है, लेकिन मैं वास्तव में "सर्वोत्तम अभ्यास" ऐप तर्क संरचना के साथ वास्तव में संघर्ष करता हूं इसलिए मैं इसके कारण कई अन्य समस्याओं में भाग नहीं लेता (क्योंकि मेरे पास वास्तव में समय नहीं है)। मुझे बस एक आकृति या कुछ ऐसा दिखाने के लिए एक "सर्वोत्तम अभ्यास" उदाहरण दिखाने की ज़रूरत है जो मेरा ऐप ऊपर बताए गए तरीके से काम करता है। मैं भी एक समस्या में भाग गया क्योंकि जब मैं मुख्य गतिविधि शुरू करता हूं तो यह एक खाते की जांच करता है और यदि यह लॉगिनएक्टिविटी लॉन्च नहीं करता है लेकिन यदि मैं वापस दबाता हूं, तो मैं मुख्य गतिविधि (unfilled) देख सकता हूं। एक सामान्य अभ्यास के

उत्तर

4

अधिक तुम क्या प्रयोग कर रहे हैं है:

General Practice

यह संरचना पूरी तरह से स्वीकार्य है और सर्वर पर निर्भर एप्लिकेशन का एक सामान्य प्रवाह है। मैं उस मॉडल को प्राथमिकता देता हूं जहां लॉगिंग केवल कुछ ऐसी सामग्री के साथ एक विकल्प है, जिसमें लॉग इन करने की आवश्यकता नहीं होती है। जब भी कोई कार्रवाई जिसके लिए लॉगिन की आवश्यकता होती है, तो उपयोगकर्ता लॉगिन दिखाता है। हालांकि, आपके मॉडल को ठीक काम करना चाहिए।

मुझे लगता है कि अपनी समस्याओं

  1. I also ran into a problem because when I start the MainActivity it checks for an account and if not it launches LoginActivity but if I press back, i can see MainActivity (unfilled).

    यह समस्या एक अदृश्य डिस्पैच गतिविधि कि MainActivity या LoginActivity वर्तमान उपयोगकर्ता की स्थिति के आधार पर की शुरूआत के साथ हल किया जा सकता है देखते हैं। आरेख में, आपके निर्णय के बाद बस finish() डिस्पैच गतिविधि। आपकी लॉगिन एक्टिविटी डिस्पैच एक्टिविटी को फिर से लॉन्च करने के लिए ज़िम्मेदार है जो अगले चरण पर फिर से शुरू होगी। आम तौर पर, डिस्पैच लॉन्च करने के लिए लॉगिन एक्टिविटी के बैकप्रेसेड को ओवरराइड न करें, सफल लॉगिन के मामले में डिस्पैच लॉन्च करें।

    हालांकि, अगर आप अपनी गतिविधि में कुछ सामग्री भले ही उपयोगकर्ता प्रवेश न होने पर दिखाने के लिए तय कर लिया है, तो आप onActivityResult एक लॉगिन अनुरोध के बाद MainActivity की सामग्री को ताज़ा करने के लिए उपयोग कर सकते।

  2. The problem is that my fragments can't get this token because, as i'm recovering the token in a thread using AccountManager.getAuthToken(), the fragments are created before this token is recovered.

    यह समस्या सामान्य है। यदि आप लॉगिन अनुरोध संसाधित करते समय अपनी गतिविधियां/टुकड़े पहले ही बनाए जाते हैं, तो आप इन्हें सूचित करने में सक्षम होना चाहिए। असल में, यदि आपके टुकड़े "अनधिकृत" सामग्री नहीं दिखाते हैं, तो आपको इस समस्या का सामना नहीं करना चाहिए क्योंकि आपको इन टुकड़ों को तब तक नहीं बनाना चाहिए जब तक कि आप लॉग इन नहीं करते हैं।

    हालांकि, अगर आपने कुछ दिखाने का निर्णय लिया है जब भी उपयोगकर्ता लॉग इन नहीं होता है तब भी आपकी गतिविधियां/टुकड़ों में सामग्री, आपको स्थिति बदलने के बारे में इन चल रहे घटकों को सूचित करना होगा। ऐसा करने का एक तरीका है अपनी गतिविधियों में एक रेज़्यूम लागू करना जो जांचता है कि उपयोगकर्ता लॉग इन है या उपयुक्त परिवर्तन करता है।

    Intent intent = new Intent("your_package_name.LOGIN_STATE_CHANGED"); 
    LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent); 
    

के

:

BroadcastReceiver mReciever = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
      //do whatever you want //check state 
    } 
}; 

public void onCreate(Bundle state) { 
    //bla bla 
    //bla bla 
    LocalBroadcastManager.getInstance(mContext).registerReceiver(mReciever, new IntentFilter("your_package_name.LOGIN_STATE_CHANGED")); 
} 

जब भी राज्य में परिवर्तन, एक प्रसारण भेजें: एक और तरीका है गतिविधियों/टुकड़े कि राज्य बदल गया है चल रहा है सूचित करने के लिए एक स्थानीय प्रसारण उपयोग करने के लिए है बेशक, यह मामला विशिष्ट हो सकता है। उदाहरण के लिए, यदि आप Touch App on Google Play जाँच, आपको लगता है कि मैं एक प्रेषण स्क्रीन है कि उपयोगकर्ता के प्रवेश राज्य की परवाह किए बिना दिखाई दे रहा है बना लिया है और उसके बाद के लिए लॉग इन करने के लिए करता है, तो वह एक गतिविधि है कि प्रवेश करना पड़ता है में प्रवेश करती है उपयोगकर्ता पूछा देखेंगे। इस मामले में, लॉगिन करने की आवश्यकता वाले किसी भी गतिविधि को इसके अनुसार एक्टिविटी रिजल्ट को लागू करना चाहिए और यूई को अपडेट करना चाहिए यदि उपयोगकर्ता लॉग इन करता है या उपयोगकर्ता को समाप्त नहीं करता है। दूसरी तरफ, psst app on Google Play उपयोगकर्ता के राज्य के आधार पर लॉगिन स्क्रीन या मुख्य स्क्रीन पर जाने का निर्णय लेने के लिए स्प्लैश स्क्रीन का उपयोग करता है।

+0

है कि पूरी तरह से खुला स्रोत Last.fm एप्लिकेशन पर एक नज़र थी और वह सीधे "लॉगिन" गतिविधि में डिस्पैच की इस प्रकार की है। उन्होंने कहा कि वास्तव में (आशय कार्रवाई की तरह) सामान का एक बहुत की जाँच क्योंकि इस गतिविधि जब उपयोगकर्ता "कोई खाता जोड़ें" सेटिंग, जब उपयोगकर्ता अनुप्रयोग विजेट कॉन्फ़िगर करता है या वह सिर्फ ऐप्लिकेशन को लॉन्च जब से आता है प्रयोग किया जाता है। क्या आपको लगता है कि यह भी करने का एक अच्छा तरीका हो सकता है? मैं भी SplashScreen से बचने के लिए, क्योंकि मैं चाहता हूँ (यहाँ गतिविधि कोड https://github.com/c99koder/lastfm-android/blob/master/app/src/fm/last/android/LastFm.java का लिंक भी है) लगता है कि यह यूएक्स – CinetiK

+0

के लिए बुरा है यह अच्छा है। हाँ। एक का कहना है, तो एक भी गतिविधि सब कुछ के लिए इस्तेमाल किया जा सकता। –

+0

धन्यवाद एक बहुत, तुम सच में मुझे इस पर मदद की! मैं इसे अभी काम करने में कामयाब रहा। – CinetiK

0

नमूना कोड ..

public class DispatchActivity extends ActionBarActivity { 


    SharedPreferences prefs = null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     prefs = getSharedPreferences("me.sanath.megh", MODE_PRIVATE); 
     boolean islogin = prefs.getBoolean("islogin",false); 
     if(islogin) 
     { 
      Intent i = new Intent(this,homepageActivity.class); 
      startActivity(i); 
      finish(); 
     }else{ 

      Intent i = new Intent(this,LoginActivity.class); 
      startActivityForResult(i,1); 
     } 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (requestCode == 1) { 
      boolean islogin = prefs.getBoolean("islogin",false); 
      if(islogin) 
      { 
       Intent i = new Intent(this,homepageActivity.class); 
       startActivity(i); 
       finish(); 
      }else{ 

       Intent i = new Intent(this,LoginActivity.class); 
       startActivityForResult(i,1); 

      } 
     } 
    } 
} 
संबंधित मुद्दे