2012-06-28 15 views
12

मेरे पास एक ऐसा एप्लिकेशन है जहां प्रविष्टि बिंदु "लॉगिन/स्पलैश"Activity कहां है, जहां मुझे सर्वर से ताजा डेटा प्री-लोड करने की आवश्यकता है। यह SplashActivity के रूप में घोषित किया जाता है:एप्लिकेशन पुनरारंभ करें - गतिविधि प्रविष्टि बिंदु

<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
मेरी AndroidManifest.xml में

, के बाद डेटा लोड किया जाता है, मैं अपने कस्टम Application वर्ग पर कुछ डेटा रखने के लिए और मैं अपने MainActivity लिए आगे बढ़ें।

मैं उम्मीद कर रहा हूँ, कि (का उपयोग करते हुए सेना बंद करो) के बाद मेरे Application ओएस द्वारा या उपयोगकर्ता द्वारा बंद कर दिया जाता है, और फिर बाद में है उपयोगकर्ता द्वारा फिर से शुरू कर दिया, अपने आवेदन के प्रवेश बिंदु SplashActivity फिर होने के लिए, लेकिन सिस्टम SplashActivity छोड़ देता है और MainActivity प्रदर्शित करता है।

प्रश्न: क्या यह अपेक्षित व्यवहार है? अगर पूरी प्रक्रिया बंद हो गई है, तो मेरा आवेदन SplashActivity के साथ शुरू नहीं होना चाहिए? क्या यह पूरा किया जा सकता है?

+0

आप एंड्रॉइड सेट कर सकते हैं: प्रकट फ़ाइल में गतिविधि टैग में noHistory = "true" – rajpara

+0

AFAIK, आपका प्रश्न गलत है, बल रोक दिया गया ऐप हमेशा अपनी मुख्य-लॉन्चर गतिविधि से शुरू होगा। – MKJParekh

उत्तर

24

वास्तव में, वहाँ कई समस्याओं है कि यह करने के लिए इस सवाल का और जवाब के कुछ लोगों द्वारा संबोधित कर रहे हैं:


अपने मूल सवाल का जवाब करने के लिए, "हाँ, यह अपेक्षित व्यवहार है"।

एंड्रॉइड प्रत्येक गतिविधि को एक अलग आत्मनिर्भर इकाई मानता है। एंड्रॉइड कार्य स्टैक में गतिविधियों की स्थिति को याद करता है और जब भी यह चाहें आपकी प्रक्रिया को मारने में कोई समस्या नहीं होती है (जिसमें आपकी सभी गतिविधियां होती हैं), क्योंकि यह "जानता है" कि जब भी इसकी आवश्यकता होती है तो यह हमेशा आपकी गतिविधियों का पुनर्निर्माण कर सकती है। यह अवधारणा निश्चित रूप से टूट जाती है जब आपके पास एक जटिल अनुप्रयोग होता है जहां आप गतिविधियों के बीच निर्भरता रखते हैं और/या आपके पास Application कक्षा (या समान स्थिर/सिंगलटन स्थान) में संग्रहीत वैश्विक डेटा है।

जब एंड्रॉयड अपनी प्रक्रिया को मारता है यह कार्य में सर्वोच्च गतिविधि याद रखता है और जब उपयोगकर्ता कार्य करने के लिए देता है यह प्रक्रिया पुन और फिर पुन केवल कार्य में सर्वोच्च गतिविधि। आपके मामले में, MainActivity

उदाहरण के लिए, अपने कार्य को ढेर इस तरह दिखता है:

StartActivity -> ActivityB -> ActivityC -> ActivityD 

और अपने कार्य को पृष्ठभूमि में चला जाता है और Android प्रक्रिया है, जब कार्य केवल ActivityD करने के लिए उपयोगकर्ता रिटर्न बनाई जाएँगी को मारता है। एक बार ActivityD समाप्त हो जाने पर, एंड्रॉइड फिर ActivityC को फिर से बनाएगा। एक बार ActivityC समाप्त हो जाने पर, एंड्रॉइड ActivityB इत्यादि को फिर से बनाएगा।संक्षेप में, पूरा स्टैक उपयोगकर्ता द्वारा कार्य को फिर से शुरू करने पर पुनर्निर्मित किया गया है।

मेनिफेस्ट सेटिंग्स या इरादे झंडे का कोई संयोजन नहीं है जो आपको इच्छित व्यवहार प्राप्त करेगा। यह अच्छा होगा अगर एंड्रॉइड ने ऐसा कुछ दिया, लेकिन फिलहाल ऐसा नहीं होता है।


आप निर्धारित कर सकते हैं यदि आपके प्रक्रिया अपने आवेदन-व्युत्पन्न वर्ग में एक स्थिर (वर्ग) बूलियन चर का उपयोग करके पुन: प्रारंभ कर दिया गया है (या किसी अन्य वर्ग में)। जब प्रक्रिया को पुनरारंभ किया जाता है तो इस चर के पास हमेशा false मान होगा और फिर आप कहीं भी वैरिएबल की स्थिति की जांच कर सकते हैं और यदि आवश्यक हो तो पुनः आरंभ करें (अपना डेटा पुनः लोड करें)। फिर आप चर को true पर सेट करते हैं। यह true रहेगा जब तक कि प्रक्रिया की हत्या और पुनर्निर्मित न हो जाए, भले ही आपकी सभी गतिविधियां खत्म हों। इस तरह आप केवल तभी प्रारंभ कर सकते हैं जब आवश्यक हो।

आप इसे SplashScreen से अपने एप्लिकेशन को पुनरारंभ करने के लिए एक संकेतक के रूप में भी उपयोग कर सकते हैं। अपने सभी गतिविधियों में तो, onCreate() में, आप राज्य इस बूलियन चर का जांच कर सकते हैं और यदि आवेदन को पुनः आरंभ कर दिया गया है तो आप बस SplashScreen इस तरह रीडायरेक्ट कर सकते हैं:

Intent intent = new Intent(this, SplashScreen.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

इस में सभी गतिविधियों खत्म हो जाएगा कार्य करें और कार्य की जड़ पर SplashScreen को पुनरारंभ करें।


बाद, यदि आपने आवेदन करने के लिए उपयोगकर्ता रिटर्न (जब यह पृष्ठभूमि में किया गया था और बाद में AndroidOS ने मार डाला), तो आप डेटा है कि आप में डाउनलोड संग्रहीत करना चाहिए डेटा हर बार डाउनलोड करने के लिए होने से रोकना चाहते निजी कैश क्षेत्र और जब एप्लिकेशन को पुनरारंभ किया जाता है तो इसका उपयोग करें। यह आपकी प्रक्रिया को मारने और पुनरारंभ करने पर बार-बार डेटा डाउनलोड करने से रोकता है।


इससे निपटने का एक और तरीका सेवा में अपना डेटा लोड करना होगा। अगर आपके पास Service आपकी प्रक्रिया में चल रहा है तो एंड्रॉइड आपकी प्रक्रिया को मारने की संभावना कम है। उपयोगकर्ता को आपके आवेदन के साथ समाप्त होने पर आपको यह सुनिश्चित करने की आवश्यकता है कि आप अपना Service बंद कर दें।


मुझे एहसास है कि यह उत्तर लंबी हवादार है। उम्मीद है कि आप इससे कुछ प्राप्त कर सकते हैं।

+0

हां। इस पर आपके समय के लिए धन्यवाद। मैं वास्तव में आश्वस्त था कि एक बार ओएस द्वारा प्रक्रिया बंद हो जाने के बाद, एप्लिकेशन को प्रवेश बिंदु से पुनरारंभ किया जाएगा ... क्योंकि जब हम इसे रोकते हैं तो ऐसा होता है ... डीडीएमएस, या सेटिंग्स-> अनुप्रयोगों को थ्रूग करें। –

+2

नहीं, यह वास्तव में सच नहीं है। जब आप इसे रोकते हैं तो क्या होता है: डीबगर इसे मारने की प्रक्रिया को संकेत भेजता है, इसलिए प्रक्रिया मर जाती है। एंड्रॉइड इसे देखता है और कहता है "ओह, उस एप्लिकेशन में एक बुरी तरह से व्यवहार की गई गतिविधि है जिसके कारण यह मर गया। इसलिए मैं उस प्रक्रिया को उपयोगकर्ता के लिए पुनरारंभ करने जा रहा हूं, लेकिन इससे पहले कि मैं इसे बुरी तरह से व्यवहार करने वाली गतिविधि को हटाने जा रहा हूं ढेर से "। तो आप जो देखते हैं वह प्रक्रिया आपकी मूल गतिविधि के साथ पुनरारंभ होती है। –

+0

आप दोनों के लिए एक बिलियन धन्यवाद ... मैंने इसी तरह की समस्या पर कुछ दिन बिताए हैं http: //stackoverflow.com/questions/11190469/android-app-crashes- अचानक- दौरान- आश्चर्यजनक ... प्रश्न और आपका उत्तर वास्तव में बहुत मदद की ... – aProgrammer

0

यह इस तरह किया जा सकता है:

1.SplashActivity कोई संदेह नहीं है हर बार शुरू कर देंगे।

2. डेटा डाउनलोड करें और लोडिंग (बूलियन) को सहेजने से पहले लोड किया गया है। आप SharedPreferences का उपयोग कर सकते हैं।

3. अगली बार स्थिति की जांच करें और तुरंत MainActivity शुरू करें।

+0

हां, लेकिन एक बार जब मैंने अपना "चेक" सही पर सेट किया, तो मैं इसे "झूठा" कब सेट करूं? –

+0

"1" के संबंध में, आप कैसे तर्क दे सकते हैं कि स्पलैश हर बार शुरू होगा? एप्लिकेशन को पुनरारंभ करने के बाद, यहां किसी को भी वही समस्या हो रही है http://stackoverflow.com/questions/11190469/android-app-crashes- अचानक-while-running/11242705#11242705 –

+0

क्या आपको हर बार डेटा डाउनलोड करने की आवश्यकता है ऐप शुरू होता है? –

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