2013-02-24 72 views
6

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

क्या समस्या है? सेवा दुर्घटनाग्रस्त लगभग हर बार जब उपयोगकर्ता ऐसा करने की कोशिश करता है..और बहुत कुछ और भी। उदाहरण के लिए, एक गीत बजाना, और फिर एक गेम खोलना सेवा को दुर्घटनाग्रस्त करता है, कभी-कभी क्रोम पर वेब ब्राउज़ करने जैसी हल्की चीजें भी इसे दुर्घटनाग्रस्त कर देती हैं।

कुछ विवरण:

1 - सेवा startService(new Intent(this, MyMusicService.class)); के माध्यम से शुरू कर दिया है, लेकिन जब उपयोगकर्ता छोड़ देता है गतिविधि मैं startForeground(mId, mNotification); फोन एक जारी सूचना है कि आसान नियंत्रण प्रदान करता है दिखाने के लिए, और इसलिए भी क्योंकि startForeground() सेवाओं के लिए intented है कि ऐसा करना चाहिए activityManager द्वारा इन की हत्या के रूप में प्राथमिकता के आधार पर उपयोगकर्ता अनुभव के लिए विघटनकारी होगा (अगर सेवा मार दिया जाता है संगीत बंद कर दिया जाता है)

2 जा - मैं दुर्घटना पुन: पेश करने का प्रयास किया है, और यह निश्चित रूप से जब ऐसा न करने से होता है क्रोम पर ब्राउजिंग की तरह भारी काम (यह क्रैश को लगभग 50% समय का पुनरुत्पादन करेगा), और हमेशा मंदिर चलाने की तरह चीजें करते समय 2. एफवाईआई, अगर कुछ भी नहीं कर रहा है - बस पृष्ठभूमि पर संगीत बजाना और निष्क्रिय, प्लेबैक बिल्कुल बंद नहीं होगा, और यह वैसे ही काम करता है जिस तरह से इसका इरादा है।

3 - फ़ोन जो मैं परीक्षण डिवाइस के रूप में उपयोग कर रहा हूं वह धीमा या कम-स्मृति डिवाइस किसी भी माध्यम से नहीं है, यह गैलेक्सी नेक्सस है।

4 - मैं कुछ देशांतर पकड़ने की कोशिश की है और कभी कभी यह बस का कहना है:

02-24 06:53:32.586: I/ActivityManager(387): Process com.deadpixels.light.player (pid 27720) has died. 
किसी अन्य संदेशों बिना

, और कभी कभी एक ही संदेश एक WINDEATH के साथ है:

02-24 06:53:32.586: W/ActivityManager(387): Scheduling restart of crashed service com.deadpixels.light.player/.service.MyMusicService in 5000ms 
02-24 06:53:32.602: W/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9 
02-24 06:53:32.602: E/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 
02-24 06:53:32.602: W/InputDispatcher(387): Attempted to unregister already unregistered input channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' 
02-24 06:53:32.602: I/WindowState(387): WIN DEATH: Window{418d09c8 u0 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity} 

क्या मैं भी देखा है कि लगभग हमेशा जब दुर्घटना होता है, अन्य सेवाओं का एक बहुत "मर" है। मैं पूर्ण लॉग here संलग्न कर रहा हूं।

5 - मैं ACRA का उपयोग कर दुर्घटना के बारे में अधिक जानकारी प्राप्त करने की कोशिश की लेकिन फिर भी सब कुछ सही ढंग से सेटअप होने के लिए, दुर्घटनाग्रस्त लॉग भेजा जा रहा है, या बस कुछ नहीं होता के बाद लगता है। मैं जानता हूँ कि ACRA दुर्घटना का पता लगाता है और शुरू होता है:

02-24 06:53:37.719: D/ACRA(28293): ACRA is enabled for com.deadpixels.light.player, intializing... 
02-24 06:53:37.742: D/ACRA(28293): Using default Mail Report Fields 
02-24 06:53:37.742: D/ACRA(28293): Looking for error files in /data/data/com.deadpixels.light.player/files 
02-24 06:53:37.742: W/ACRA(28293): com.deadpixels.light.player reports will be sent by email (if accepted by user). 

लेकिन कुछ भी भेजा जा रहा है, न तो इन्हें मेल करें मैं स्थापित करने के लिए, या गूगल डॉक्स में फार्म के लिए।

सुनिश्चित नहीं है कि और क्या प्रयास करें, और मैं उम्मीद कर रहा था कि कुछ अच्छे विचारों को देखने के लिए क्या करना है। जैसा कि मैंने कहा, सेवा कुछ चीजें करता है, कि मेरे ज्ञान के लिए संसाधन-व्यापक नहीं है, और ईमानदार होने के लिए, मुझे यह भी यकीन नहीं है कि यह क्रैश होने वाली सेवा के साथ कुछ भी करना है या नहीं।

सेवा में होने वाली कई कोड बिट्स के gist और यहां एसीआरए कोड स्थापित किए गए हैं। यह ध्यान देने योग्य भी है कि मैंने अन्य संगीत खिलाड़ियों के साथ दुर्घटनाग्रस्त होने वाली सेवा को पुन: उत्पन्न करने की कोशिश की और मैंने इस मुद्दे पर बिल्कुल भी भाग नहीं लिया।

मदद के लिए धन्यवाद!

उत्तर

3

ऐसा लगता है कि ओएस सोचता है कि जैसे ही उपयोगकर्ता आपकी गतिविधि छोड़ देता है, जैसे ही यह 'अग्रभूमि' सेवा होने के बावजूद आपकी सेवा पृष्ठभूमि में है।

मैं अपने MyMusicService सेवा डिजाइन होगा थोड़ी अलग है, हालांकि:

  1. onCreate में MediaPlayer तैयार करते हैं।
  2. onStart या onStartCommand आपकी सेवा के कार्यान्वयन में, चयनित/उपयुक्त ध्वनि फ़ाइल खेलना शुरू करें। यदि आप पृष्ठभूमि में संगीत रखना चाहते हैं, भले ही डिवाइस सो रहा हो, आंशिक wake_lock को प्राप्त करें। वापसी START_STICKY
  3. स्टेटस बार में अधिसूचना जोड़ें। में, सबकुछ साफ़ करें।

जब संगीत बंद हो जाता है, या तो उपयोगकर्ता इंटरैक्शन या जब गीत समाप्त होता है, तो अधिसूचना को हटाना और वेक लॉक जारी करना सुनिश्चित करें।

एक अच्छा ट्यूटोरियल यहां पाया जा सकता है। http://www.youtube.com/watch?v=mcb99u8Nlgs&list=PL14AA2548E3C96B50

अपडेट के बाद ओपी टिप्पणी/अद्यतन 'सार' कहा:

मुझे लगता है कि के onReceive अपने BroadcastReceivermReceiver आपकी सेवा में एक डेटाबेस तक पहुँचता है। यह मुद्दा हो सकता है। इसे IntentService पर बंद करें: onReceive में, को उसी Intent का उपयोग करके onReceive प्राप्त करें। फिर IntentService सभी वास्तविक कार्य कर सकता है और प्रक्रिया की हत्या के कारण किसी भी संभावित धीमी डेटाबेस पहुंच के बारे में चिंता न करें।

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

+0

मैं वास्तव में पहले से ही onStartCommand दौरान START_STICKY लौट रहा हो जाएगा। जहां तक ​​क्रिएट है, मैं खिलाड़ी को शुरू करता हूं, लेकिन मैं अभी तक तैयार नहीं कर सकता क्योंकि सेवा शुरू होने से पहले भी सेवा शुरू हो गई है और इसलिए मुझे पता नहीं है कि मुझे किस गीत को पारित करना चाहिए। साथ ही, जब कोई गाना बज रहा है, तो मैं स्टेटस बार अधिसूचना जोड़ता हूं, मुझे यकीन नहीं है कि क्या आपने पोस्ट की गई गड़बड़ी पर देखा है। हालांकि मैं एक वाकेलॉक प्राप्त करने में देखता हूं जिसे मैंने नहीं सोचा था क्योंकि मुझे 30 मिनट की अवधि के लिए बीजी में संगीत चलाने के बाद से फोन की आवश्यकता नहीं थी, जबकि मैं फोन का उपयोग नहीं कर रहा था। –

+0

'गिस्ट' लिंक में, मुझे कोई 'ऑनस्टार्ट' या 'ऑनस्टार्ट कमांड' कार्यान्वयन नहीं देखा गया, इसलिए मैंने पूछा क्यों :) यदि आप सेवा के ऑनक्रेट में 'स्टार्टफ़ोरग्राउंड' कह रहे हैं, तो आंशिक वेक लॉक केवल तब उपयोगी होता है जब आप डिवाइस सोते समय भी खेलना चाहता है। जब डिवाइस सो नहीं जाता है तो 'startForeground' को सेवा की हत्या को रोकना चाहिए था। क्या आपने अपनी सेवा के प्रसारण-प्राप्तकर्ताओं में अपनी ऑनसेसिव विधि (ओं) के कार्यान्वयन की जांच की है? उन्हें जल्दी से चलना चाहिए; यदि नहीं, तो आपकी प्रक्रिया मारे जा सकती है। –

+0

हाय, आप सही हैं, मैंने ऑनस्टार्ट कमांड शामिल नहीं किया है, मैंने अभी जोड़ा क्योंकि मैंने गिस्ट को अपडेट किया था। इसके अलावा, मैं गतिविधि छोड़ते समय केवल प्रारंभिक भूमि को कॉल करता हूं (यानी, घर जाने पर, या दूसरी गतिविधि), और फिर से शुरू होने पर रोकथाम (सत्य) को कॉल करें। जहां तक ​​ऑनसीसीव है, सुनिश्चित नहीं है कि मैं यह देखने के लिए कैसे परीक्षण कर सकता हूं कि यह जल्दी से चलता है या नहीं। मैंने gist –

0

यह निश्चित रूप से आपकी सहायता करेगा यदि आपने अपने आर्किटेक्चर के बारे में अधिक जानकारी प्रदान की है, विशेष रूप से आपकी गतिविधि और आपकी सेवा कैसे सहभागिता करती है।

पाठ्यक्रम का जंगली अनुमान, लेकिन मेरे लिए ऐसा लगता है जैसे आपकी सेवा में आपकी गतिविधि का संदर्भ है। जैसे ही आप एक अलग ऐप का उपयोग करते हैं, आपकी गतिविधि नष्ट हो सकती है।

कुछ प्रश्न।

  • क्या आपकी सेवा और आपकी गतिविधि एक ही प्रक्रिया में चलती है? (यह प्रभावित करता है कि गतिविधि और सेवा के बीच की जानकारी कैसे साझा की जा सकती है।)
  • क्या आपकी गतिविधि कक्षा में कोई चर है जो सेवा तक पहुंचने का प्रयास करती है? (यदि वे बिल्कुल भी आवेदन कक्षा में हैं, तो
+0

हां, वे दोनों एक ही प्रक्रिया पर चलते हैं। मैंने विभिन्न प्रक्रियाओं को करने की कोशिश की, लेकिन एडीएल इंटरफ़ेस ने मुझे नट्स चलाया। जहां तक ​​पहुंच है, वे ज्यादातर इरादों के माध्यम से संवाद करते हैं, उदाहरण के लिए उपयोगकर्ता गतिविधि पर प्ले बटन पर क्लिक करता है, फिर एक प्रसारण भेजा जाएगा, जो सेवा प्रसारण के अतिरिक्त पर निर्दिष्ट गीत को पकड़ती है और बजाती है। अपने पहले प्रश्न का उत्तर देने के लिए, नहीं, सेवा गतिविधि का संदर्भ नहीं रखती है। –

2

मुझे यह वही समस्या थी, क्या आप जांच सकते हैं कि आपका एमआईडी आपकी अधिसूचना आईडी के समान है या नहीं?यह भी 0 से अलग है, क्योंकि यह इसे गतिविधि की आईडी से जोड़ देगा और गतिविधि के साथ मर जाएगा।

संपादित करें: यह भी जांचें कि आपका कोड हैडल पर उपयोग नहीं करता है लेकिन ऑनस्टार्ट कमांड।

0

अपने कोड की जांच करें, हो सकता है कहीं न कहीं अपने System.exit(0); की तरह अपने प्रक्रिया अपने आप को नष्ट,, यदि आप ऐसा करते हैं, तो लॉग

channel '418d09c8  

com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity(server)' 
~ Consumer closed input channel or an error occurred. events=0x902-24 06:53:32.602: 
E/InputDispatcher(387): channel '418d09c8 
com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' 
    ~ Channel is unrecoverably broken and will be disposed!