5

हैलो मैं एक wakelock को नियंत्रित करने के लिए एक सेवा का उपयोग करने की कोशिश कर रहा हूँ ताकि जब मैं अपना आवेदन चल रहा हो, तो मैं स्क्रीन को स्थायी रूप से छोड़ सकता हूं। मैं wakelock बनाते हैं और इसे क्रिएट() पर सक्रिय करता हूं और इसे डेस्ट्रॉय() में रिलीज़ करता हूं, हालांकि मुझे त्रुटि मिलती है "wl को हल नहीं किया जा सकता"। क्या कोई यह समझा सकता है कि मैं इसे कैसे प्राप्त कर सकता हूं? नीचे दिए गए कोड:एक सेवा में एक wakelock का उपयोग एंड्रॉइड 1.5

public class WakeLockService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
    } 
    @Override 
    public void onDestroy() { 
     wl.release(); 
    } 
} 

उत्तर

5

आप लाइन

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 

OnDestroy में() गायब नहीं कर रहे हैं? यह ऑन्रेट() पर एक स्थानीय चर है, लेकिन इसे डेस्ट्रॉय() पर घोषित नहीं किया गया है।

या, अधिक संभावना है, तो आप इसे स्थानीय चर के बजाय कक्षा WakeLockService का एक क्षेत्र बनाना चाहते हैं।

9

ठीक है, भले ही आप एक आवृत्ति चर का उपयोग करेंगे, मुझे लगता है कि यह ऐसा करने का तरीका नहीं है। destroy() पर कॉल करने वाला कौन है? मुझे आशा नहीं है कि ऐसा करने के लिए ओएस नौकरी है। लेकिन जब आप एक वेक लॉक धारण कर रहे हैं तो यह बेहद असंभव है कि आपकी destroy() विधि कॉल की जाती है, क्योंकि ओएस पहले अन्य गतिविधियों/सेवाओं को नष्ट कर देगा।

इसके अलावा, onCreate() विधि में वेक लॉक प्राप्त करने में बहुत देर हो चुकी है। onCreate() से पहले पहुंच गया है जब आप पृष्ठभूमि में मौजूद गतिविधि से अलार्म बनाम सेवा से ट्रिगर करते हैं तो फोन पहले ही सो सकता है।

यह कहना मुश्किल है कि आपको अलग-अलग संदर्भ क्यों देना चाहिए क्योंकि आप अधिक संदर्भ नहीं देते हैं। घटनाओं का सामान्य पाठ्यक्रम यह है। ए BroadcastReceiver को कॉल किया जाता है और onReceive() में आप जागते हुए लॉक प्राप्त करते हैं और इसे अपनी सेवा पर स्थिर चर में डाल देते हैं। जब सेवा पूरी की जाती है तो उसे stopSelf() पर कॉल करना चाहिए, जागने के लॉक को छोड़ दें और फिर स्थैतिक चर को शून्य करें जो ताला का संदर्भ रखता है।

इसके अलावा, यदि आप एक सेवा का उपयोग करते हैं तो एक पूर्ण जागने की ताला संभावना है जो आप चाहते हैं, लेकिन आंशिक जागने का तालाब है। आपको स्क्रीन पर रहने की ज़रूरत नहीं है, है ना?

क्षमा करें, लेकिन ऊपर वर्णित मुद्दों के कारण जागने वाले ताले वास्तव में जटिल हैं। यह निश्चित रूप से एक उन्नत विषय है और इसे पेंच करना आसान है। यदि आप करते हैं, तो आपके ऐप को बहुत बदसूरत टिप्पणियां मिलेंगी, क्योंकि बहुत लंबे समय तक पकड़ना एक बड़ा अपराध है क्योंकि यह बैटरी को हटा देता है। कृपया इसे गलत तरीके से न लें, लेकिन यहां पोस्ट की गई समस्या की प्रकृति को देखते हुए (वाक्यविन्यास/कंपाइलर त्रुटि) मैं दृढ़ता से सलाह देता हूं कि बिना किसी सेवा के समाधान और लॉक लॉक हो।

+0

टिप्पणी के लिए धन्यवाद। आवेदन में मैं काम कर रहा हूं, मुझे 100% जागने के तरीके में फोन की आवश्यकता है इसलिए मैंने पूर्ण जागने का उपयोग क्यों किया। – Tom

+0

सीपीयू को पावर करने और नेटवर्क का उपयोग करने के लिए आंशिक वाकेलॉक पर्याप्त होना चाहिए। – Eno

+0

मेरे साथ भी धन्यवाद। आपकी व्याख्या संक्षेप में है, और प्रश्न और उत्तर संयुक्त से अधिक उपयोगी :) – Melllvar

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