एंड्रॉइड को मेरी प्रक्रिया को कैसे अनुकरण करना है


174

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

मुझे पता है कि मेरी प्रक्रिया को कैसे मारना है। यह समस्या नहीं है। समस्या यह है कि जब मैं अपने प्रक्रिया को मारने (डी डी एम एस का उपयोग कर, है adb shell kill, Process.killProcess(), आदि) एंड्रॉयड यह उसी तरह है कि यह होता अगर Android ओएस यह अपने आप को मार डाला था पुनः आरंभ नहीं करता है।

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

दूसरी ओर, अगर मैं इस प्रक्रिया को मारता हूं , तो एंड्रॉइड मानता है कि गतिविधि स्टैक के शीर्ष पर गतिविधि बुरी तरह से व्यवहार की गई थी , इसलिए यह स्वचालित रूप से प्रक्रिया को फिर से बनाता है और फिर गतिविधि स्टैक से शीर्ष गतिविधि को हटाता है और नीचे की गतिविधि को फिर से बनाता है। शीर्ष गतिविधि (onCreate () `कॉल करना)। यह वह व्यवहार नहीं है जो मैं चाहता हूं। मैं वही व्यवहार चाहता हूं जब एंड्रॉइड प्रक्रिया को मारता है।

बस सचित्र समझाने के लिए, अगर मेरी गतिविधि स्टैक इस तरह दिखती है:

    ActivityA -> ActivityB -> ActivityC -> ActivityD

यदि एंड्रॉइड प्रक्रिया को मारता है और उपयोगकर्ता एप्लिकेशन पर वापस लौटता है, तो एंड्रॉइड प्रक्रिया को फिर से बनाता है और एक्टिविटी बनाता है।

अगर मैं इस प्रक्रिया को मारता हूं, तो एंड्रॉइड इस प्रक्रिया को फिर से बनाता है और एक्टिविटी बनाता है।


4
क्या आप पृष्ठभूमि में आपको मारने के लिए आवश्यक प्रक्रियाओं की मात्रा नहीं बना सकते हैं?
एलेक्स डब्ल्यू


2
@Pang मुझे लगता है कि आप इस बिंदु को याद कर रहे हैं। मुझे पता है कि कैसे पता लगाया जाए कि एंड्रॉइड ने प्रक्रिया को मार दिया है। मुझे कोड मिला है जो इन स्थितियों को संभालता है। जो मैं करना चाहता हूं वह इस कोड को ठीक से (और स्वचालित तरीके से) परीक्षण करना है । ऐसा करने के लिए, मुझे एंड्रॉइड को उकसाने में सक्षम होने के कुछ तरीके की आवश्यकता है जो मेरी प्रक्रिया को ठीक उसी तरह से मार सके जैसे कि यह सामान्य रूप से संसाधन दबाव में होता है। जुड़ा हुआ प्रश्न, जबकि दिलचस्प है, यहाँ कोई मूल्य नहीं जोड़ता है।
डेविड वासर


@IgorGanapolsky लिंक के लिए धन्यवाद, लेकिन वास्तव में उन लिंक में से कोई भी समस्या का समाधान नहीं है।
डेविड वासर

जवाबों:


127

मेरे लिए यह परीक्षण करने का सबसे अच्छा तरीका था:

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

कुछ उपकरणों पर आप एप्लिकेशन - एक्टिविटी के साथ एप्लिकेशन (गतिविधि) पर वापस भी आ सकते हैं - आपका लॉन्चर आइकन लेकिन अन्य डिवाइसों पर इसके बजाय गतिविधि शुरू हो जाएगी।

यह एंड्रॉइड डॉक्स उस बारे में कह रहे हैं:

जब उपयोगकर्ता होम स्क्रीन से उस कार्य को फिर से चुनता है, तो सामान्य रूप से, सिस्टम एक कार्य को साफ़ कर देता है (कुछ गतिविधियों को रूट गतिविधि के ऊपर स्टैक से हटा देता है)। आमतौर पर, यह तब किया जाता है जब उपयोगकर्ता ने कुछ समय के लिए कार्य का दौरा नहीं किया हो, जैसे कि 30 मिनट।


2
आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरे लिए उपयोगी नहीं है क्योंकि मुझे ऐसा करने के लिए एक स्वचालित तरीके की आवश्यकता है, स्वचालित परीक्षण के लिए।
डेविड वासर

1
यह वास्तव में मेरे लिए मददगार था।
जॉन रॉबर्ट्स

6
यह स्वचालित नहीं है, लेकिन यह मेरे उद्देश्यों के लिए पूरी तरह से काम करता है। चरण 2 को छोड़ना बहुत महत्वपूर्ण नहीं है । इस काम के लिए डीडीएमएस में प्रक्रिया को रोकने से पहले आपको ऐप को पृष्ठभूमि पर भेजना होगा। उन लोगों के लिए, जहाँ डॉक्टर उद्धरण यहाँ से आए थे । हालांकि मुझे यकीन नहीं है कि वे वास्तव में विषय से संबंधित हैं क्योंकि यह <activity>प्रकट में टैग के बारे में है।
टोनी चैन

1
बिल्कुल वही जो मुझे चाहिए था। धन्यवाद। जो लोग नहीं जानते हैं, डीडीएमएस ग्रहण में है, विंडो पर जाएं -> ओपन पर्सपेक्टिव, और आपको इसे ढूंढना चाहिए।
रिचर्ड

4
वैकल्पिक रूप से आप "विकास के विकल्प" पर जा सकते हैं और "कोई पृष्ठभूमि प्रक्रियाओं" के लिए पृष्ठभूमि की सीमा निर्धारित करें फिर हर बार जब आप घर दबाते हैं तो प्रक्रिया मर जाएगी।
जोआओ गावाज़ी

56

यह मेरे लिए काम करने लगता है:

adb shell am kill <package_name>

यह adb shell killओपी द्वारा उल्लिखित अलग है ।

ध्यान दें कि am killकमांड के लिए मदद कहती है:

am kill: Kill all processes associated with <PACKAGE>.  Only kills.
  processes that are safe to kill -- that is, will not impact the user
  experience.

यदि यह अग्रभूमि में है, तो यह प्रक्रिया को नहीं मारेगा। यह काम करना चाहता है क्योंकि ओपी चाहता था कि अगर मैं अपने ऐप से दूर जाता हूं, तो adb shell am kill <package_name>इसे चलाएं ऐप को मार देगा (मैंने psडिवाइस पर इसका उपयोग करने की पुष्टि की है)। फिर अगर मैं उस ऐप पर वापस लौटता हूं, जो मैं पहले की गतिविधि में वापस आ गया था - यानी ओपी के उदाहरण में प्रक्रिया फिर से हो जाती है और गतिविधि (बजाय गतिविधिसी की तरह हत्या के अन्य तरीकों से ट्रिगर लगता है) बनाता है।

क्षमा करें, मुझे ओपी में कुछ साल देर हो गई है, लेकिन उम्मीद है कि अन्य लोग इसे उपयोगी पाएंगे।


धन्यवाद! यह वही है जिसे मैं देख रहा था! मैं यह निर्दिष्ट करना चाहता हूं कि यह कमांड अलग तरीके से व्यवहार करता है adb shell am force-stop। पिछले एक भी अपने अनुप्रयोग से संबंधित किसी भी लंबित (जैसे सूचनाएं) को हटा देगा, जबकि पहले वाला नहीं।
bonnyz

किसी को भी इंगित करता है जो ओएस स्रोत कोड की जांच करता है कि यह देखने के लिए कि यह किस कोड को चलाता है जब यह मेमोरी को पुनः प्राप्त करने के लिए एक प्रक्रिया को मारता है - मेरी शर्त यह कोड के समान है am kill
androidguy

Android 7.1 Samsung J5 पर काम नहीं करता है। psमेरे ऐप को दिखाता है
वलगल

17

एक अन्य विधि, शायद एक ऐसा स्क्रिप्ट है जो DDMS की आवश्यकता नहीं है:

एक बार सेटअप: डेवलपर विकल्पों पर जाएं, पृष्ठभूमि प्रक्रिया सीमा सेटिंग का चयन करें, 'मानक सीमा' से 'नो बैकग्राउंड प्रोसेस' में मूल्य बदलें।

जब आपको प्रक्रिया को पुनरारंभ करने की आवश्यकता होती है, तो होम बटन दबाएं। प्रक्रिया को मार दिया जाएगा (आप स्टूडियो में लॉगकैट / एंड्रॉइड मॉनिटर में सत्यापित कर सकते हैं - प्रक्रिया को चिह्नित किया जाएगा [डीएएडी])। फिर कार्य स्विचर का उपयोग करके ऐप पर वापस जाएं।


2
दिलचस्प। मुझे लगता है कि फ़ॉरग्राउंड सर्विसेज पर कोई असर नहीं पड़ता है, है ना?
इगोरगानापोलस्की

मुझे एंड्रॉइड पर चलने वाले वास्तविक उपकरणों पर ऐसा करने की आवश्यकता है जैसे कि 2.3.3, इसलिए यह कोई मदद नहीं है।
डेविड वासर

13

यह प्रश्न पुराना है लेकिन, इस प्रश्न का एक उत्तर है जिसमें adb, Android Studio आदि की आवश्यकता नहीं है। केवल आवश्यकता API 23 या नए की है।

OS द्वारा ऐप रीस्टार्ट को अनुकरण करने के लिए, जब आपका ऐप चल रहा हो तो ऐप सेटिंग्स पर जाएं, (तब आप सक्षम कर सकते हैं) एक अनुमति और हाल ही में ऐप को ऐप वापस करें। जब अनुमति अक्षम हो जाती है, तो OS ऐप को मार देता है, लेकिन सहेजे गए इंस्टेंस को रखता है। जब उपयोगकर्ता ऐप लौटाता है, तो ऐप और अंतिम गतिविधि (सहेजी गई स्थिति के साथ) को फिर से बनाया जाता है।

नो बैकग्राउंड प्रोसेस ’विधि कभी-कभी समान व्यवहार का कारण बनती है, लेकिन हमेशा नहीं। उदाहरण के लिए, यदि ऐप एक पृष्ठभूमि सेवा चला रहा है, तो "कोई पृष्ठभूमि प्रक्रियाएं" कुछ नहीं करती हैं। लेकिन ऐप को अपनी सेवाओं सहित सिस्टम द्वारा मारा जा सकता है। यदि ऐप में कोई सेवा है तो अनुमति की विधि भी काम करती है।

उदाहरण:

हमारे ऐप में दो गतिविधियाँ हैं। एक्टिवा एक मुख्य गतिविधि है जिसे लॉन्चर से शुरू किया जाता है। एक्टिवा से एक्टिविटी शुरू होती है। मैं केवल onCreate, onStart, onStop, onDestroy तरीके दिखाऊंगा। एंड्रॉइड onSaveInstanceState को onStop पर कॉल करने से पहले हमेशा कॉल करता है, क्योंकि एक गतिविधि जो स्टॉप स्टेट पर होती है उसे सिस्टम द्वारा मारा जा सकता है। [ https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle]

अनुमति विधि:

<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop (the order is like this, it is stopped after new one is started)
<go settings>
ActivityB onStop
<disable a permission>
//Application is killed, but onDestroy methods are not called.
//Android does not call onDestroy methods if app will be killed.
<return app by recent apps>
Application onCreate (this is the important part. All static variables are reset.)
ActivityB onCreate WITH savedInstance (user does not notice activity is recreated)
//Note that ActivityA is not created yet, do not try to access it.
ActivityB onStart
<return ActivityA by back>
ActivityA onCreate WITH savedInstance (user does not notice activity is recreated)
ActivityA onStart
ActivityB onStop
ActivityB onDestroy
<press back again, return launcher>
ActivityA onStop
ActivityA onDestroy
<open app again>
//does not call Application onCreate, app was not killed
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart

मैं अन्य तरीकों की तुलना करना चाहता हूं जो अन्य उत्तरों पर उल्लिखित हैं।

गतिविधियों को न रखें: यह एप्लिकेशन को नहीं मारता है।

<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop
ActivityA onDestroy (do not keep)
<return launcher by home button>
ActivityB onStop
ActivityB onDestroy (do not keep) 
<retun app from recent apps>
// NO Application onCreate
ActivityB onCreate WITH savedInstance (user does not notice activity recreated)
ActivityB onStart
<return ActivityA by back>
ActivityA onCreate WITH savedInstance (user does not notice activity recreated)
ActivityA onStart
ActivityB onStop
ActivityB onDestroy
<press back again, return launcher>
ActivityA onStop
ActivityA onDestroy
<open app again>
//does not call Application onCreate, app was not killed
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart

बल रोक विधि: सहेजे गए इंस्टेंस को संग्रहीत नहीं करता है

<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop
<go settings>
ActivityB onStop
<force stop, return app from recent apps>
Application onCreate
ActivityA onCreate WITHOUT savedInstance 
//This is important part, app is destroyed by user.
//Root activity of the task is started, not the top activity.
//Also there is no savedInstance.

~ " ऐप को उसकी सेवा सहित सिस्टम द्वारा मारा जा सकता है "।
फ़ॉरग्राउंड

@DavidWasser कल्पना पढ़ें! developer.android.com/guide/compords/services.html#Foreground एक अग्रभूमि सेवा एक ऐसी सेवा है जिसे उपयोगकर्ता सक्रिय रूप से जानता है और स्मृति में कम होने पर सिस्टम को मारने के लिए उम्मीदवार नहीं है।
इगोरगानापोलस्की

3
@IgorGanapolsky प्रलेखन अच्छा है, खासकर अगर यह पूर्ण और सही है (जो दुर्भाग्य से यह नहीं है), लेकिन मैं आमतौर पर वास्तविक व्यक्तिगत टिप्पणियों पर अधिक भरोसा करता हूं। मैंने एक अग्रभूमि Serviceको बहुत बार मारते देखा है । भले ही सिस्टम मेमोरी पर कम न हो। अधिकांश डिवाइस निर्माताओं ने बैटरी की शक्ति को बचाने के लिए एंड्रॉइड ओएस पर अपनी "अनुकूलन" और "सुधार" लिखा है। कई उपकरणों में मानक एंड्रॉइड की तुलना में बहुत अधिक एग्रेसिव "हत्यारे" होते हैं।
डेविड वासर

@ डेविडवॉशर मेला अवलोकन। तो इन सभी वर्षों के बाद, आप एक समाधान के साथ आए थे?
इगोरगानापोलस्की

@IgorGanapolsky No. मैंने इस समस्या का कोई हल नहीं पाया है। इसलिए सवाल अभी भी खुला है।
डेविड वासेर

7

मुझे पार्टी में बहुत देर हो चुकी है और इससे पहले कि मैं एक ही सही जवाब देता हूं, लेकिन जो भी मेरे लिए आता है उसे सरल बनाने के लिए मेरे होम बटन को दबाएं और इस कमांड को चलाएं:

adb shell ps | grep <package name> | awk '{print $2}' | xargs adb shell run-as <package name again> kill

एप्लिकेशन राज्य नहीं खोएगा और मेरे स्वयं के अनुभव से यह उसी तरह काम करता है जैसे ओएस ने पृष्ठभूमि में ऐप को मार दिया। यह केवल डीबग निर्मित अनुप्रयोगों के लिए काम करता है


मुझे मिलता है'grep' is not recognized as an internal or external command, operable program or batch file.
डेल

लेकिन मैंने इसे शेल में रहते हुए किया था run-as <package name> kill 7379, लेकिन इसने मुझे पिछली गतिविधि पर रखा था, न कि उस गतिविधि पर जब मैंने होम बटन दबाया था।
डेल

6

यह आप इसे Android Studio में कैसे करते हैं।

  1. अपने डिवाइस को डिबग मोड में अपने कंप्यूटर से कनेक्ट करें।
  2. अपने डिवाइस पर ऐप खोलें और जिस भी गतिविधि में आप "मृतकों में से लौटें" का परीक्षण करना चाहते हैं।
  3. अपने डिवाइस पर होम बटन दबाएं।
  4. एंड्रॉइड स्टूडियो में एंड्रॉइड मॉनिटर -> मॉनिटर पर जाएं और टर्मिनेट एप्लिकेशन आइकन दबाएं।
  5. अब आप या तो हाल के ऐप्स के माध्यम से अपने ऐप पर वापस जा सकते हैं या लॉन्चर आइकन पर क्लिक करके, व्यवहार मेरे परीक्षणों में समान है।

2
यह कोई मदद नहीं है। मुझे टेस्ट सूट के भीतर यह प्रोग्राम करने की जरूरत है। लेकिन फिर भी धन्यवाद।
डेविड वासर

इसके अलावा, यह उत्तर मार्क के उत्तर के समान ही है।
डेविड वासर

किसी भी विचार कैसे UIAutomator या एस्प्रेसो के माध्यम से ऐसा करने के लिए?
इगोरगानापल्स्की 13

मैं नहीं मिल सकता है Android Monitor - Monitors। कुछ ऐसा होना चाहिए जिससे उन्हें छुटकारा मिले। मैं v 3.2.1 पर हूं
डेल

1
@ डेल एंड्रॉइड डिवाइस मॉनिटर को एंड्रॉइड स्टूडियो 3.1 में पदावनत किया गया और एंड्रॉइड स्टूडियो 3.2 से हटा दिया गया।
19

5

एप्लिकेशन को होम बटन के साथ बैकग्राउंड में रखें

एंड्रॉइड स्टूडियो में "लॉगकैट" मोड में अपनी प्रक्रिया का चयन करें, फिर नीचे के कोने में समाप्त करें एप्लिकेशन पर क्लिक करें

बटन समाप्त करें

अब एंड्रॉइड डिवाइस पर लॉन्चर से अपना ऐप लॉन्च करें


EDIT: इंटरनेट के अनुसार, निम्नलिखित भी काम करता है:

 adb shell am kill [my-package-name]

भविष्य से EDIT: कुछ ध्यान दें, एंड्रॉइड स्टूडियो 4.0 में एक बदलाव हुआ है, यदि आप Runएएस से उपयोग करते हैं , तो Terminateएक मुद्दा जारी करेगा Force Stop

हालाँकि, यदि आप लॉन्चर से बाद में लॉन्च करते हैं, और जब आप इसे इस तरह से अनुकरण करने की कोशिश करते हैं, तो आपको वे परिणाम मिलेंगे जो आप चाहते हैं (कम मेमोरी व्यवहार)।


यह एक डुप्लिकेट उत्तर है
ओनिक

@ ओनिक अन्य सभी को डीडीएम और जैसे भी हो, अनावश्यक फुलझड़ी का एक गुच्छा होता है। हालांकि तकनीकी रूप से हाँ, stackoverflow.com/a/41975750/2413303 एक ही बात कहता है। शायद मुझे चित्र जोड़ना चाहिए।
इपिकपांडफार्स

यह मददगार नहीं है। मेरे पास एक परीक्षण हार्नेस है और मैं इन कार्यों को परीक्षण हार्नेस से निष्पादित नहीं कर सकता। इसके अलावा, व्यवहार वैसा नहीं है जैसा कि एंड्रॉइड प्रक्रिया को मारता है।
डेविड वासर

the behaviour is not the same as what happens when Android kills the processहाँ यह है
EpicPandaForce

यह प्रक्रिया मुझे पिछली गतिविधि दिखाती है, न कि जब होम बटन दबाया जाता है तो गतिविधि।
डेल

2

आप व्यवहार के लिए मांगी गई चीजों को पुन: पेश करने के लिए अगले कदम कर सकते हैं:

  1. अपना ऐप खोलें, शीर्ष गतिविधि पर जाएं
  2. किसी अन्य पूर्ण-स्क्रीन अनुप्रयोग (उदाहरण के लिए, सिस्टम सेटिंग्स पर - दाएं शीर्ष कोने में नेविगेट करने के लिए सूचना पैनल का उपयोग करें)
  3. अपनी आवेदन प्रक्रिया को मार डालो
  4. बैक बटन दबाएं

1
आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरे लिए उपयोगी नहीं है क्योंकि मुझे ऐसा करने के लिए एक स्वचालित तरीके की आवश्यकता है, स्वचालित परीक्षण के लिए।
डेविड वासर

तो, यह एकमात्र तरीका है जो मैंने पाया है कि वास्तव में एंड्रॉइड क्लियरिंग मेमोरी का अनुकरण करेगा और आपके ऐप को मार देगा (मेरा एपीआई स्तर 19 है, और इसलिए मैं सेंड-ट्रिम-मेमोरी कमांड का उपयोग नहीं कर सकता)। अन्य कमांड जैसे कि adb शेल am बल-स्टॉप com.my.app.package या किल, उसी सटीक प्रक्रिया को पुन: उत्पन्न नहीं करेगा जो उपरोक्त प्रक्रिया का पालन करेगा!
मार्क ग्रेसिया

2

सेटिंग के अंतर्गत डेवलपर विकल्पों में, 'गतिविधियों को न रखें' चुनें, जो कि जैसे ही आप उनसे दूर जाते हैं, वे गतिविधियों को नष्ट कर देंगे।

नोट: नीचे दिए गए एक उपयोगी टिप्पणी के अनुसार, केवल इस का उपयोग करें यदि आप स्थैतिक मूल्यों को साफ करने के बारे में परवाह नहीं करते हैं।


यह प्रभावी रूप से उसी तरह का है जैसा कि समाधान पहले से ही पोस्ट किया गया है - और खारिज कर दिया - एक साल पहले। फर्क सिर्फ इतना लगता है कि यह अनुप्रयोग एक एमुलेटर पर सेट करने के लिए उपयोग किया जाता है, बनाम अधिक हाल के फोन जो इसका समर्थन करते हैं।
क्रिस स्ट्रैटन

1
क्षमा करें, जैसा कि क्रिस स्ट्रैटन कहते हैं, यह अन्य उत्तर के समान ही बहुत अधिक सुझाव है। यह Android परिष्करण गतिविधियों के बारे में नहीं है। यह एंड्रॉइड पूरी प्रक्रिया को मारने के बारे में है (जो यह करता है, बहुत नियमित रूप से और प्रभावी रूप से, विशेष रूप से एंड्रॉइड 4.x पर चलने वाले एचटीसी उपकरणों पर)।
डेविड वासर

6
यह एक लगभग अच्छा है लेकिन यह प्रक्रिया को नहीं मारेगा, यह केवल गतिविधि को नष्ट कर देता है। इसका क्या मतलब है? आपकी गतिविधि saveInstanceState के साथ खोली जाएगी लेकिन सभी स्थिर चर अभी भी प्रक्रिया में हैं। प्रक्रिया के बाद सभी स्थिर चर को भी मार दिया जाता है।
मार्क

1

होम बटन दबाएं और ऐप को पहले बैकग्राउंड में रखें। फिर डीडीएमएस या एडीबी से प्रक्रिया को रोकें या मारें।


आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरे लिए उपयोगी नहीं है क्योंकि मुझे ऐसा करने के लिए एक स्वचालित तरीके की आवश्यकता है, स्वचालित परीक्षण के लिए।
डेविड वासर

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

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

आपका क्या मतलब था ~ " और पहले ऐप को बैकग्राउंड में रख दिया "?
इगोरगानापोलस्की 14

1

आप टर्मिनल से अपने डिवाइस / एमुलेटर से भी जुड़ सकते हैं adb shell, फिर अपनी प्रक्रिया के पीआईडी ​​प्राप्त करें ps | grep <your_package_nameऔर निष्पादित करें kill -9 <pid>। फिर हाल के ऐप्स पिकर से अपना न्यूनतम ऐप खोलें और यह अंतिम गतिविधि को फिर से शुरू करेगा


क्या यह वही है जो एंड्रॉइड कम-मेमोरी स्थितियों के तहत एक प्रक्रिया को मार रहा है? मुझे लगता है कि ओपी विशेष रूप से चाहते थे कि ...
इगोरगानपोलस्की

1
@IgorGanapolsky सैद्धांतिक रूप से है, हालाँकि आप ऐसा नहीं कर सकते कि वास्तविक डिवाइस पर अगर यह रूट नहीं है।
19

0

आपकी समस्या की जड़ यह प्रतीत होती है कि Activityजब आप इस प्रक्रिया को मारते हैं, तो आप अग्रभूमि में होते हैं।

डीडीएमएस में स्टॉप दबाकर आप इसे देख सकते हैं Activity(जैसा आप वर्णन करते हैं वैसा ही होता है) और इसकी तुलना घर के बाद स्टॉप दबाने और बाद में ऐप पर लौटने से होती है।

बस moveTaskToBack(true)अपने परीक्षणों में किसी भी तरह सुनिश्चित करें ।


0

मुझे यकीन नहीं है कि यह वह उत्तर है जिसकी आप तलाश कर रहे हैं, यह एक तर्क की तरह लगता है।

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

इसलिए मेरा विचार या सुझाव एक और छोटा ऐप बनाना है, जो नई गतिविधियों को पॉप अप करता रहे, जब तक कि एंड्रॉइड मेमोरी से बाहर न निकल जाए और पृष्ठभूमि को मारना शुरू कर दे।

लाइन के बीच कुछ:

गतिविधि शुरू करें -> चल रही प्रक्रिया की जाँच करें यदि ऐप सूची में है, तो वेतन वृद्धि करें और वर्तमान गतिविधि को बंद किए बिना लूप को पुनः आरंभ करें, अन्यथा -> मैं घटाएं और वर्तमान गतिविधि को बंद करें, पिछले पर वापस जाएं और पुन: जांच करें ...


0

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

मुख्य बिंदुओं में से एक यहाँ ActivityRecordफ़ील्ड कहा जाता है haveState, जिसे एंड्रॉइड फ्रेमवर्क इंजीनियरों ने वर्णन किया है कि "क्या हमने अंतिम गतिविधि राज्य प्राप्त किया है?"।

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

अगर मैं इस प्रक्रिया को मारता हूं, तो एंड्रॉइड इस प्रक्रिया को फिर से बनाता है और एक्टिविटी बनाता है।

इस मामले में एक्टिविटी android:stateNotNeeded="true"में एप्लिकेशन मैनिफ़ेस्ट में विशेषता नहीं है और यह वर्तमान में अग्रभूमि में चल रहा है, इसलिए एंड्रॉइड इसे इतिहास से हटा देता है क्योंकि सिस्टम ने अपनी अंतिम स्थिति प्राप्त नहीं की है।

एंड्रॉइड को मेरी प्रक्रिया को कैसे अनुकरण करना है

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

इसके बावजूद, आवेदन प्रक्रिया मृत्यु परिदृश्य का परीक्षण करने का एक और सरल तरीका भी है। ऊपर वर्णित सभी तथ्य और इस तथ्य को जानते हुए, कि यदि आप वर्तमान में चल रहे एक्टिविटी से नया एक्टिविटी शुरू करते हैं, तो onStop()एक्टिविटी onResume()पद्धति के बाद ही एक्टिविटी कॉलबैक लागू किया जाता है , आप निम्न ट्रिक कर सकते हैं।

class TerminatorActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val isPrePie = applicationInfo.targetSdkVersion < Build.VERSION_CODES.P
        val callbacks = TerminatorLifecycleCallbacks(isPrePie)
        (applicationContext as Application).registerActivityLifecycleCallbacks(callbacks)
    }

    private class TerminatorLifecycleCallbacks(
        // Before P onSaveInstanceState() was called before onStop(), starting with P it's
        // called after
        // Used to schedule the death as app reports server that activity has stopped
        // after the latest of these was invoked
        private val isPrePie: Boolean
    ) : ActivityLifecycleCallbacksDefault {

        private val handler = Handler(Looper.getMainLooper())

        override fun onActivityPostStopped(activity: Activity) {
            if (isPrePie) {
                terminate()
            }
        }

        override fun onActivityPostSaveInstanceState(activity: Activity, outState: Bundle) {
            if (!isPrePie) {
                terminate()
            }
        }

        fun terminate() {
            handler.postDelayed(
                {
                    Process.killProcess(Process.myPid()) // This is the end... 
                },
                LAST_MILLIS
            )
        }

        companion object {
            // Let's wait for a while, so app can report and server can handle the update
            const val LAST_MILLIS = 100L
        }

    }

    private interface ActivityLifecycleCallbacksDefault : Application.ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
        override fun onActivityStarted(activity: Activity) {}
        override fun onActivityResumed(activity: Activity) {}
        override fun onActivityPaused(activity: Activity) {}
        override fun onActivityStopped(activity: Activity) {}
        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        override fun onActivityDestroyed(activity: Activity) {}
    }
}

इसके बाद शुरू करें TerminatorActivityजब आप एप्लिकेशन को मारना चाहते हैं।

अंत में एक हल्का उपकरण होता है जो आपके आवेदन की प्रक्रिया के परीक्षण को आसान बनाता है , जिसे वेनोम कहा जाता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.