2017-01-24 11 views
5

मेरे पास एक एंड्रॉइड एप्लिकेशन है जिसमें चैट क्लाइंट की सुविधाओं में से एक है। चैट क्लाइंट पृष्ठभूमि में XMPP सर्वर के रूप में Smack लाइब्रेरी के आधार पर XMPP का उपयोग करता है और Openfire को पृष्ठभूमि में चलाता है। कनेक्शन BOSH का उपयोग करके स्थापित किया गया है पूरे एक्सएमपीपी कनेक्शन हैंडलिंग को आने वाले संदेशों के लिए पृष्ठभूमि में चलाने और सुनने के लिए एक सेवा के रूप में लागू किया गया है, भले ही ऐप की गतिविधि अग्रभूमि में न हो। अब तक, सबकुछ ठीक से काम करता है।एंड्रॉइड/स्मैक: एक्सएमपीपी कनेक्शन को नींद मोड में जिंदा रखें

एकमात्र समस्या नींद मोड प्रतीत होती है। एम्यूलेटर में (जब "जागृत रहें" पर सेट किया जाता है) या फोन के उपयोग के साथ, एक्सएमपीपी कनेक्शन हो रहा है और ऐप संदेश भेज और प्राप्त कर सकता है। हालांकि, एक बार फोन नींद मोड में जाता है, तो एक्सएमपीपी कनेक्शन टूट जाता है - मैं इसे ओपनफायर सर्वर के एडमिन कंसोल में देख सकता हूं कि उपयोगकर्ता ऑफ़लाइन है। सहजता से, मैं हर समय संदेश प्राप्त करना चाहता हूं, उदाहरण के लिए, व्हाट्सएप।

बेशक, मैंने स्टैक ओवरफ्लो सहित ऑनलाइन खोज की है, लेकिन मुझे एक निश्चित उत्तर नहीं मिला। अक्सर उपयोग का मामला यह प्रतीत होता है कि एक कार्य समय-समय पर किया जाना चाहिए, हर घंटे एक बार कहें। लेकिन चैट क्लाइंट के मामले में यह फ़िर नहीं लगता है। के बाद से मुझे लगता है कि यह एक आम उपयोग है - सब के बाद, वहाँ एक बहुत से चैट ऐप्स या ऐप्लिकेशन चैट के साथ वहाँ की सुविधा है - इन मेरे सवाल कर रहे हैं:

  • मैं कैसे करने के लिए बदलने के लिए/का विस्तार ऐप है कि फोन सो रहा है, जबकि मैं चैट संदेश प्राप्त कर सकते हैं?

  • मैंने WakeLock पर ठोकर खाई है। क्या यह जाने का तरीका है या ये मेरे उपयोग के मामले के लिए उपयुक्त नहीं हैं?

  • लॉलीपॉप के बाद, JobScheduler एपीआई भी है जो स्वयं WakeLock का उपयोग करता है। इससे बेहतर नहीं हो सकता?

  • उदाहरण के लिए, व्हाट्सएप इस मामले को कैसे संभालता है?

एक तरफ ध्यान दें: मुझे डिबगिंग के लिए एमुलेटर का उपयोग करके नींद मोड में समस्याएं हैं। जब मैं एमुलेटर में "सावधान रहें" बंद करता हूं, तो स्क्रीन 1+ मिनट के बाद काला हो जाती है और एक्सएमपीपी कनेक्शन टूट जाता है। लेकिन मुझे किसी भी तरह का पता नहीं है कि काला होने के बाद एमुलेटर को कैसे जगाया/स्विच करना है। एंड्रॉइड स्टूडियो वास्तव में मुझे किसी बिंदु पर बताता है कि डिवाइस या कुछ चला गया है, और मुझे फिर से एमुलेटर को पुनरारंभ करना होगा।

उत्तर

2

पुश अधिसूचना का उपयोग करके इस समस्या को हल करने का सही तरीका है।

डिवाइस निष्क्रिय होने पर निर्दिष्ट निष्क्रिय अंतराल के बाद डिस्कनेक्ट होने के लिए एक्सएमपीपी कनेक्शन का प्राकृतिक व्यवहार है।

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

यदि प्रमाणित नहीं है, तो यह कनेक्शन को फिर से स्थापित करता है। इस तरह, अधिकांश चैट ऐप्स इस टाइमआउट अपवाद का प्रबंधन करते हैं।

आशा इस मदद करता है :)

+0

आपको पुश अधिसूचनाओं की आवश्यकता नहीं है, न ही यह "निर्दिष्ट निष्क्रिय अंतराल के बाद डिस्कनेक्ट होने के लिए एक्सएमपीपी कनेक्शन का प्राकृतिक व्यवहार" है। – Flow

2

आप पुश सूचनाएं की जरूरत नहीं है तुम WakeLock रों जरूरत नहीं है।इसके बजाय बस

  • श्वेतसूची Doze मोड
  • एक चिपचिपा (START_STICKY) पृष्ठभूमि सेवा
  • उपयोग स्मैक के ServerPingWithAlarmManager
  • CONNECTIVY_CHANGED उद्देश्यों पर अधिनियम एंड्रॉयड द्वारा भेज उपयोग से अपने अनुप्रयोग, और प्रयोग XMPPTCPConnection 'में रों instantShutdown() मामला।
+0

यह बैटरी जीवन को कैसे प्रभावित करता है। अगर मैं सही ढंग से समझता हूं, तो डोज़ मोड से ऐप्स को श्वेतसूची में मोबाइल फोन उपयोगकर्ता से ठीक है। – Christian

+0

बैटरी जीवन पर असर इस बात पर निर्भर करता है कि कितने एक्सएमपीपी स्टैनजास तार पर जाते हैं। इस प्रकार आपको अनावश्यक यातायात से बचना चाहिए। – Flow

+0

@Flow अंतिम विषय का उद्देश्य क्या है? धन्यवाद – joao2fast4u

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