2011-12-05 13 views
8

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

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

मैंने BroadcastReciever का उपयोग करने का प्रयास नहीं किया, लेकिन कुछ लोगों के विषय में खुदाई और एसओ पर पढ़ने के बाद मुझे नहीं लगता कि यह मेरे लिए काम करेगा।

समेट करने के लिए, मेरा प्रश्न: PhoneStateListener क्यों नहीं सोते हैं जब फ़ोन सो जाता है? क्या इस व्यवहार को कुशलता से दूर करने के लिए कोई रास्ता है (जैसे फोर्स फोन जागने या विभिन्न तंत्र का उपयोग करने के लिए)?

+0

'अनपेक्षित रूप से, यह है कि इस तरह से मदद की लग रहा है .. । यह सुनिश्चित नहीं है कि यह अप्रत्याशित रूप से सुनने के नोट्स के लिए प्रलेखन के रूप में है, पंजीकरण पर, और जब एक निर्दिष्ट टेलीफोनी राज्य बदलता है, टेलीफ़ोनी प्रबंधक I उचित कॉलबैक विधि nvokes। – tidbeck

उत्तर

7

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

तो यदि यह आपके लिए व्यावहारिक है, तो मैं सुझाव दूंगा कि जब भी आप इन मानों को देखना चाहते हैं तो स्क्रीन चालू हो जाएगी। आप वेक लॉक प्राप्त करके और झंडे प्रदान करके ऐसा कर सकते हैं: ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

संपादित करें: पुन: पंजीयन श्रोता वास्तव में स्थान परिवर्तन निष्पादित करने के लिए ट्रिगर किया जाएगा, लेकिन यह वर्तमान कक्ष की जानकारी, स्क्रीन से पहले ही अंतिम ज्ञात सेल की जानकारी बंद जा रहा पारित नहीं करता है। वर्तमान सेल जानकारी प्राप्त करने के लिए, आपको अभी भी स्क्रीन चालू करने की आवश्यकता होगी। शुरू में

1

कॉल:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "call_lock"); 

और अंत में:

wakeLock.release(); 

आप अनुमति की जरूरत:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
संबंधित मुद्दे