android क्यों आवेदन कभी कभी killProcess पर पुनरारंभ होगा?




android-activity activity-lifecycle (4)

आमतौर पर, कॉल करके अपने आवेदन से बाहर निकलता है:

android.os.Process.killProcess(android.os.Process.myPid());

घटना के बिना अच्छी तरह प्रदर्शन करता है

लेकिन हर एक बार थोड़ी देर में, आवेदन फिर से शुरू होगा (बाहर निकलने के बाद!)।

संबंधित लॉग स्निपेट से पता चलता है:

.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9
.641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18
.651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died.
.651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false}
.661: I/AudioService(164):  AudioFocus  abandonAudioFocus() from android.media.[email protected]
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003}

मुझे पता है कि, एंड्रॉइड ओएस के डिज़ाइन से, मार-प्रोसेस () एक एप्लिकेशन को समाप्त करने का उचित तरीका नहीं है। यह इसलिए है क्योंकि killProcess () प्रक्रिया को रोकने के लिए या उसके लिए तैयार करने के लिए किसी भी तरह से या मौका देने के बिना तुरंत प्रक्रिया रोक देता है।

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

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

लेकिन अब मैं देखता हूं कि इस आवेदन का पक्ष प्रभाव पड़ता है कभी-कभी खुद को मारने के तुरंत बाद शुरु होता है- सभी 30 मिलीसेकेंड में

एक सीधा समाधान सभी अनुप्रयोगों की गतिविधियों के माध्यम से दोहराना होगा और उन्हें खत्म करना होगा () । लेकिन इस के साथ आगे बढ़ने से पहले, मैं यह जानना चाहता हूँ कि एंड्रॉइड ओएस में जो आवेदन करता है, वह स्वयं को पुनर्जन्म करता है।

क्यों एंड्रॉइड एक मारे गए आवेदन पुनः आरंभ करेगा?

और क्यों असंगत है? (यानी कभी-कभी )


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

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658



एडीटी 17.0.0 से , एक स्थैतिक फ़ील्ड BuildConfig.DEBUG जो आपको डिबगिंग पर मदद करेगा। उदाहरण के लिए आपके पास एक स्थिर वर्ग हो सकता है जिसमें चलने वाली गतिविधियों के सभी उदाहरण मौजूद हैं। तो आप एक समय में उन सभी को समाप्त कर सकते हैं। मुझे लगता है कि यह killProcess() से बेहतर है ...


क्या आपका ऐप एक ही प्रक्रिया में चल रहा है, या कई? killProcess एक एकल प्रक्रिया को मार डालेगा, जरूरी नहीं कि आपका संपूर्ण आवेदन। इसके बजाय ActivityManager#killBackgroundProcesses(String packageName) का उपयोग करने की कोशिश करें

अगर वह काम नहीं करता है, तो ऐसा लगता है कि प्रक्रिया को मारने के बाद सिस्टम के व्यवहार को समझाते हुए ये लिंक उपयोगी हो सकते हैं।

और वैसे, एंड्रॉइड सिस्टम यह है कि आपका आवेदन पुनः आरंभ हो रहा है ... यह विकास के उद्देश्यों के लिए अपने व्यवहार (यानी बंद को पुनरारंभ करने से क्षुधा को रोकने के द्वारा) को हेरफेर करने के लिए ठीक है, लेकिन जब आप अपने ऐप को पुश करेंगे उत्पादन के लिए





android-windowmanager