2011-02-19 19 views
6

में चलने की जरूरत है मेरे ऐप में, मुख्य गतिविधि की ऑनक्रेट() विधि में मैं एक जाग लॉक बना रहा हूं ताकि अगर फोन चालू हो तो CPU चालू रहेगा स्टैंडब/स्क्रीन बंद हो जाता है।एंड्रॉइड - वेक लॉक ठीक से अधिग्रहण नहीं कर रहा है, ऐप को स्टैंडबाय

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

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

मैं अलग ताले के साथ इस की कोशिश की है -

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Howaya"); 
     wl.acquire(); 

     if (appStart == true) 
     { 
      Intent AccelService = new Intent(this, Accelerometer.class); 
      AccelService.putExtra("unreg", false); 
      startService(AccelService); 
     } 
     appStart = false; 
    } 

मैं निम्नलिखित अनुमति मेरी प्रकट में सेट है। logcat पर मेरे उत्पादन यहां है -

F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: Howaya 
F/PowerManager(15628): at android.util.Log.wtf(Log.java:260) 
F/PowerManager(15628): at android.util.Log.wtf(Log.java:239) 
F/PowerManager(15628): at android.os.PowerManager$WakeLock.finalize(PowerManager.java:329) 
F/PowerManager(15628): at dalvik.system.NativeStart.run(Native Method) 

मैं कह रही है कि आंशिक wakelocks इस तरह इस लिंक Google standby error page के रूप में की तरह वे क्या करना चाहिए काम नहीं करते, लोगों को देखा है लेकिन इस जारी किया है और पिछले साल बंद कर दिया तो मैं नहीं जानता कि गया था क्या यह मामला है, क्या कोई यहां कृपया मदद कर सकता है? मेरे पास एक आखिरी बिंदु भी है, धन्यवाद के रूप में एक एचटीसी इच्छा है।

उत्तर

2

मेरे ऐप में, मुख्य गतिविधि की ऑनक्रेट() विधि में मैं एक जाग लॉक बना रहा हूं ताकि अगर कैमरा स्टैंडब/स्क्रीन चालू हो जाए तो CPU चालू रहेगा।

कृपया इसके लेआउट में विजेट में से किसी एक पर android:keepScreenOn का उपयोग करें। यह WakeLock से मैन्युअल रूप से निपटने की तुलना में गतिविधियों के लिए कहीं अधिक सुरक्षित है। इसके अलावा, आपको WAKE_LOCK अनुमति, आईआईआरसी की आवश्यकता नहीं है।

logcat पर मेरे उत्पादन यही कारण है कि त्रुटि है, क्योंकि आप WakeLock जारी कभी नहीं यहाँ

है। कृपया WakeLocks रिसाव न करें।

अब, आप इस सब गद्य को लिखने में कामयाब रहे और इन सभी लिस्टिंग को शामिल किया, और आप एक छोटी सी चीज़ भूल गए: वास्तव में हमें बता रहा है कि आपका प्रश्न है। StackOverflow जैसे प्रश्न-उत्तर-उत्तर साइट के लिए यह एक महत्वपूर्ण आइटम है। और, नहीं, "क्या कोई यहां कृपया मदद कर सकता है?" एक प्रश्न के रूप में गिनती नहीं है जब आप कभी भी "सहायता" को परिभाषित नहीं करते हैं जिसे आप प्राप्त करना चाहते हैं।

+0

ठीक है क्षमा करें अगर मैं अस्पष्ट था और उत्तर के लिए धन्यवाद। मेरा सवाल यह था कि मैं अपने फोन पर एक वॉकलॉक कैसे चला सकता हूं ताकि स्क्रीन अभी भी बंद होने पर मेरा ऐप चल सके, क्योंकि मैं जिस कोड का उपयोग कर रहा हूं वह काम नहीं कर रहा है। मैं स्क्रीन पर नहीं रखना पसंद करूंगा ताकि वह बैटरी को बर्बाद न करे और अगर मैंने इसे बाजार में डालने का फैसला किया तो विजेट का उपयोग नहीं करना पड़ेगा (फिर अन्य उपयोगकर्ताओं को विजेट का उपयोग करना होगा) – bobby123

+1

@ bobby123 : आंशिक 'वेक लॉक' के लिए एक गतिविधि में तार्किक आवश्यकता नहीं हो सकती है। ए * सेवा * को आंशिक 'वेक लॉक' की आवश्यकता हो सकती है, लेकिन एक गतिविधि नहीं, जिसका मौजूदा उद्देश्य केवल स्क्रीन पर सामान प्रदर्शित करना है। इसलिए, या तो गतिविधि से और सेवा में अपना 'वेक लॉक' प्राप्त करें (मिलान करने के लिए अपने व्यावसायिक तर्क को समायोजित करें), या 'एंड्रॉइड: keepScreenOn' का उपयोग करें। अपनी 'WakeLock' को अपनी सेवा के' क्रिएट() 'में प्राप्त करें और इसे' onDestroy() 'में रिलीज़ करें। 'StartForeground() 'का उपयोग करें, इसलिए आपकी सेवा को नियुक्त नहीं किया गया है और उपयोगकर्ता को सेवा को रोकने के लिए गतिविधि प्राप्त करने का एक आसान तरीका प्रदान करता है। – CommonsWare

+0

यही वह है जिसे मैं जानना चाहता था, धन्यवाद। मैं वेक लॉक को सेवा में ले जाऊंगा क्योंकि मुझे इसकी ज़रूरत है। मेरे पास किसी भी समय सेवा समाप्त करने के लिए मेनू बटन है। एक आखिरी सवाल कृपया, क्या आपको पता है कि एक्सेलेरोमीटर के लिए सेंसर चेंज() पर विधि आंशिक जागने के लॉक के तहत अभी भी काम करनी चाहिए या क्या यह अभी भी Google के साथ एक मुद्दा है? – bobby123

9

समस्या तब होती है क्योंकि आपकी WakeLock ऑब्जेक्ट ऑनक्रेट विधि के अंदर एक स्थानीय स्कोप्ड चर है। विधि निष्पादित होने के बाद - वेक लॉक ऑब्जेक्ट का अब और संदर्भ नहीं दिया गया है - इस प्रकार कचरा संग्रह के लिए पात्र है। यदि दलविक जीसी होता है - ऑब्जेक्ट को अंतिम रूप देने के लिए तैयार है - और फाइनलाइज़र आंतरिक कोड आपको चेतावनी देता है कि वेक लॉक अभी भी आयोजित है - और सक्रिय - लेकिन जीसी'एड होगा। आपको नई वेक लॉक ऑब्जेक्ट प्राप्त करना होगा और इसे अपनी गतिविधि व्युत्पन्न कक्षा में कक्षा प्रकार वेक लॉक के क्षेत्र में असाइन करना होगा। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग और कचरा कलेक्टर के बारे में पढ़ें - आप इस मुद्दे को समझेंगे।

0

जैसा कि @ मिचल पी ने कहा, आप क्रिएट विधि में एक वाकेलॉक प्राप्त करते हैं, लेकिन आप इसे कभी जारी नहीं करते हैं।

जब जीसी इस शून्य संदर्भित ऑब्जेक्ट को स्कैन करता है, डिफ़ॉल्ट अंतिम विधि को कॉल करें, लेकिन असल में यह सक्रिय है।

@Override 
    protected void finalize() throws Throwable { 
     synchronized (mToken) { 
      if (mHeld) { 
       Log.wtf(TAG, "WakeLock finalized while still held: " + mTag); 
       Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0); 
       try { 
        mService.releaseWakeLock(mToken, 0); 
       } catch (RemoteException e) { 
       } 
      } 
     } 
    }