2012-04-24 12 views
15

मैं एक एंड्रॉइड गतिविधि उपकरण परीक्षण लिखने की कोशिश कर रहा हूं जो रोकता है (onPause(), फिर onStop()) और वर्तमान गतिविधि को पुनरारंभ करता है। मैंनेएंड्रॉइड इंस्ट्रूमेंटेशन टेस्ट में किसी गतिविधि को कैसे रोकें और पुनरारंभ करें?

activity.finish(); 
activity = getActivity(); 

... लेकिन यह ठीक से काम नहीं कर रहा है।

परीक्षण का लक्ष्य यह मानना ​​है कि फॉर्म डेटा onPause() विधि के दौरान संग्रहीत किया जाता है और onStart() विधि के दौरान फिर से पढ़ा जाता है। यह मैन्युअल रूप से करते समय काम करता है, लेकिन परीक्षण विफल रहता है, जिससे मैं निष्कर्ष निकालता हूं कि activity.finish() एक गतिविधि को रोकने और पुनरारंभ करने का गलत तरीका प्रतीत होता है।


संपादित करें: मेरा मुख्य समस्या एक तुल्यकालन मुद्दा रहा है लगता है। गतिविधि को पुनरारंभ करने के बाद, परीक्षण धावक सभी ईवेंट हैंडलरों को समाप्त करने की प्रतीक्षा नहीं करता था। निम्नलिखित लाइन परीक्षा निष्पादन रुकती है जब तक गतिविधि निष्क्रिय है:

getInstrumentation().waitForIdleSync() 

कि इसके अलावा, जीवन चक्र के बारे में अधिक बहुमूल्य जानकारी के लिए स्वीकार कर जवाब पर एक नज़र डालें।

+0

ठीक से काम नहीं करता है? – yorkw

+0

@yorkw मैंने प्रश्न अपडेट किया, टिप्पणी के लिए धन्यवाद। –

+0

जब आप कहते हैं, "इसे मैन्युअल रूप से कर रहे हैं?" –

उत्तर

13

बुला (या स्क्रीन का ऑरिएंटेशन बदलने को गति प्रदान):

onPause() -> onStop() -> onDestroy() -> onCreate() 

क्या आप की जरूरत है:

onPause() -> onStop() -> onRestart() 

activity.finish(); // old activity instance is destroyed and shut down. 
activity = getActivity(); // new activity instance is launched and created. 

गतिविधि के कारण पूरा मनोरंजन जीवन चक्र के माध्यम से जाना

मैंने हाल ही में Instrumentation API का खुलासा किया और बहुत ही रोचक गतिविधि जीवन चक्र पाया ई ट्रिगर विधि callActivityOnXXX(), कोड की निम्न एकल लाइन मुश्किल करना चाहिए:

MyActivity myActivity = getActivity(); 
// make activity falling into restart phase: 
getInstrumentation().callActivityOnRestart(myActivity); 

गतिविधि जीवन चक्र आरेख अधिकारी देव गाइड से उद्धृत: अपने कोड enter image description here

+1

असल में, मैंने पहले समाधान को पहले समाधान दिया है, और ऐसा लगता है कि आप मेरे प्रश्न में देख सकते हैं। लेकिन हो सकता है कि आप सही हों और समस्या असंबद्ध है ... अपना दूसरा सुझाव दो, मैं इसे बाद में कोशिश करूंगा ... –

+0

@DaniloBargen, मेरा अपडेट देखें। – yorkw

+0

जो वास्तव में ऐसा किया, बहुत बहुत धन्यवाद! :) क्या आप इसे दूसरों के लिए अपने उत्तर के शीर्ष पर अधिक आसानी से ढूंढने पर ध्यान देंगे? –

0

शायद यू नई आशय बनाने के लिए .class का एक नया उदाहरण प्राप्त करने के लिए, अपनी गतिविधि के नाम को बचाने के लिए कोशिश कर सकते खत्म यह ... और उपयोग प्रतिबिंब ...

2

एक अच्छा तरीका जीवन चक्र घटनाओं का परीक्षण करने के लिए स्क्रीन अभिविन्यास परिवर्तन के माध्यम से है। मेरे अनुभव में यह ऑनपॉज़/ऑनस्टार्ट पैटर्न पर बमप्रूफ करने का एक सुविधाजनक तरीका है।

+0

दिलचस्प विचार। इसके साथ समस्या यह है कि एंड्रॉइड स्क्रीन अभिविन्यास परिवर्तन करते समय डिफ़ॉल्ट रूप से फॉर्म डेटा सहेजता है, इसलिए यह वास्तव में इस टेस्ट केस को कवर नहीं करता है ... –

+0

एक स्क्रीन अभिविन्यास परिवर्तन जिसके परिणामस्वरूप पूर्ण गतिविधि जीवन चक्र: ... -> ऑन पॉज़ () -> ऑनस्टॉप() -> ऑनस्ट्रोय() -> ऑनक्रेट() -> ऑनस्टार्ट() -> ..., जिसमें कॉलिंग गतिविधि का वही व्यवहार है। फिनिश(); गतिविधि = getActivity(); – yorkw

+0

@DaniloBargen मुझे विश्वास नहीं है कि जब कोई गतिविधि नष्ट हो जाती है तो फॉर्म डेटा डिफ़ॉल्ट रूप से सहेजा जाता है। –

10

मैं .finish बुला(), setActivity (शून्य), getActivity की कोशिश की() और यह गतिविधि को पुनरारंभ करता है, लेकिन मेरे लिए यह राज्य को बहाल नहीं कर रहा था। मैंने एसओ पर अन्य सभी उत्तरों की कोशिश की, और ऐसा करने के लिए हर दूसरी विधि मैं ऑनलाइन पा सकता था, और उनमें से कोई भी मेरे लिए काम नहीं करता था।ज्यादा प्रयोग करने के बाद मैं निम्नलिखित काम करता पाया (nb: एपीआई स्तर 11+ की आवश्यकता है):

getInstrumentation().runOnMainSync(new Runnable() { 
     @Override 
     public void run() { 
      activity.recreate(); 
     } 
    }); 
    setActivity(null); 
    activity = getActivity(); 

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

मुझे नहीं पता कि यह कैसे काम करता है या यह क्यों काम करता है, मैं परीक्षण और त्रुटि के माध्यम से इस समाधान पर पहुंचा, और मैंने केवल नेक्सस 4 चल रहे किटकैट पर इसका परीक्षण किया है। मैं गारंटी नहीं दे सकता कि यह एक गतिविधि मनोरंजन को सही ढंग से अनुकरण करता है, लेकिन यह मेरे उद्देश्यों के लिए काम करता है।

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

आप देख सकते हैं कि यह विभिन्न परीक्षण केस कक्षाओं के लिए स्रोत कोड की जांच करने से कैसे काम करता है।

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

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