2012-10-02 21 views
17

पर एक लंबी चल रही सेवा के लिए सर्वश्रेष्ठ आर्किटेक्चर मैं ओएस के साथ लंबे समय तक चलने वाली सेवा को मारने के तरीके से निपटने के बारे में कुछ मार्गदर्शन की सराहना करता हूं।एंड्रॉइड

व्यापार परिदृश्य:

आवेदन एक BTT ट्रैक जो कई घंटे के लिए पिछले सकता है रिकॉर्ड करता है। यह प्रासंगिक आंकड़ों के साथ मानचित्र पर ट्रैक भी दिखा सकता है।

एप्लिकेशन उपयोगकर्ता इंटरफ़ेस उपयोगकर्ता को रिकॉर्डिंग को ट्रैक/बंद करने और मानचित्र पर रीयल टाइम ट्रैक देखने में सक्षम बनाता है।

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

मुद्दा:

एक चर समय है, जो 1 घंटे और एक आधा करने के लिए 40 मिनट तक चलता है के बाद, रिकॉर्डिंग सेवा बिना किसी चेतावनी के मार डाला जाता है। चूंकि बीटीटी आउटिंग में कई घंटे लग सकते हैं, परिणामस्वरूप ट्रैक रिकॉर्डिंग अपूर्ण है।

कुछ अतिरिक्त जानकारी:

सेवा START_STICKY के साथ शुरू किया और एक PARTIAL_WAKE_LOCK प्राप्त कर लेता है, और मुख्य गतिविधि के रूप में समान प्रक्रिया में चलता है।

उपयोगकर्ता परिभाषित दर पर 1 सेकंड से कई मिनट तक नए स्थान प्राप्त किए जाते हैं (और रिकॉर्ड किए जाते हैं)। मुझे एंड्रॉइड प्रलेखन से पता है कि यह लंबी चल रही सेवाओं के लिए अपेक्षित ओएस व्यवहार है।

प्रश्न:

सबसे अच्छा वास्तुकला डिजाइन दृष्टिकोण एक अच्छी तरह से व्यवहार अनुप्रयोग है कि व्यापार परिदृश्य आवश्यकताओं को पूरा कर सकें क्या है?

मैं विकल्पों में से एक जोड़ी के बारे में सोच सकते हैं (और मैं उनमें से किसी को पसंद नहीं है), लेकिन मैं किसी को कैसे पहले से ही सामना करना पड़ा और इसी तरह की समस्या हल हो जाती है से मार्गदर्शन चाहते हैं:

  • उपयोग प्रसारण रिसीवर (यदि संभव हो तो स्थान प्रबंधक से आदर्श रूप से कनेक्ट किया गया है) सेवा केवल तभी चल रही है जब कोई नया स्थान अधिग्रहण किया जाता है?
  • उपयोगकर्ता को मुख्य गतिविधि छोड़ने के लिए सक्षम नहीं करें (परिणामस्वरूप उपयोगकर्ता अनुभव डालना)?
  • यदि आवश्यक हो तो अलार्म प्रसारण रिसीवर सेवा को पुनरारंभ करना है?

उन सभी के लिए धन्यवाद जो इस विषय पर कुछ ज्ञान साझा कर सकते हैं।

उत्तर

9

मेरे पास एक ऐसा ऐप है जो बहुत ही समान काम करता है। मैं सुनिश्चित करता हूं कि सेवा इसे अग्रभूमि कार्य बनाकर चलती रहती है।अग्रभूमि मोड छोड़ने के लिए जब प्रवेश करने समाप्त हो गया है

void fg() { 
    Notification notification = new Notification(R.drawable.logstatus, 
        "Logging On", System.currentTimeMillis()); 
    Intent notificationIntent = new Intent(this, LoggerActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
        notificationIntent, 0); 
    notification.setLatestEventInfo(this, "Logger","Logger Running", 
       pendingIntent); 
    startForeground(1, notification); 
} 

और उसके बाद:: जब मैं चालू करवाने के लिए तैयार हूँ, मैं इस समारोह है, जो भी एक अधिसूचना सेट फोन

stopForeground(true); 
+0

धन्यवाद माइकल। मैं इसका परीक्षण करने जा रहा हूं और मैं आपको परिणाम बता दूंगा। – Luis

+0

यह बिना रुके घंटों तक चल रहा है। यह हल हो गया है :-) धन्यवाद माइकल माइकिंग। – Luis

+0

मदद करने के लिए खुशी हुई! – Michael