मैं एंड्रॉइड डिवाइस को प्रोग्रामेटिक रूप से सोने से कैसे रोक सकता हूं?


155

मैं एंड्रॉइड डिवाइस को प्रोग्रामेटिक रूप से सोने से कैसे रोक सकता हूं?

जवाबों:


133

एक विकल्प वेक लॉक का उपयोग करना है । डॉक्स से उदाहरण:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

इस पृष्ठ पर एक तालिका भी है जो विभिन्न प्रकार के वाकेलॉक्स का वर्णन करती है।

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

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

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


21
अब आपको इस विधि का उपयोग नहीं करना चाहिए क्योंकि अब यह विधि पदावनत है। अन्य उत्तरों में से एक पर एक नज़र डालें।
ड्यूकेस

4
वैकलॉक का उपयोग करने के लिए अभी भी कुछ कारण हैं, जैसे कि डिवाइस एक विशिष्ट ऐप को समर्पित है और कम से कम होने पर भी चलने की आवश्यकता है।
मग

2
PowerManager.PARTIAL_WAKE_LOCK को पदावनत नहीं किया गया है और मुझे लगता है कि यह सबसे कुशल तरीका है। यह उपयोगकर्ता को पावर बटन को दबाने की अनुमति देता है लेकिन सीपीयू तब भी चालू रहेगा जब तक उपयोगकर्ता कॉल जारी नहीं करता ();
मंसूर फहद

आधिकारिक दस्तावेज़ीकरण कहता है, "यदि आपको डिवाइस पर सोने से पहले कुछ काम पूरा करने के लिए सीपीयू को चालू रखने की आवश्यकता है, तो आप पॉवरमैनगर सिस्टम सेवा सुविधा का उपयोग कर सकते हैं जिसे वेक लॉक कहा जाता है।"
जोकिन इराचुक

यह बहुत अच्छा तरीका है, लेकिन यह पदावनत है। कृपया इस उत्तर की जाँच करें: stackoverflow.com/a/22447615/5327912
पार्थ अंजारिया

240

यदि आप किसी विशिष्ट पर स्लीप मोड को रोकना चाहते हैं View, तो बस setKeepScreenOn(true)उस पर कॉल करें Viewया keepScreenOnसंपत्ति सेट करें true। यह स्क्रीन पर स्क्रीन के बंद रहने से रोकता Viewहै। इसके लिए किसी विशेष अनुमति की आवश्यकता नहीं है।


18
इसके अलावा यह फोन को एप्लिकेशन के जीवन काल के बाहर जागने के लिए मजबूर नहीं करेगा। आप वेकॉक के साथ उस समस्या में भाग सकते हैं।
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
हां, ज्यादातर मामलों में, यह बेहतर तरीका है।
एडवर्ड फॉक

8
यह चयनित उत्तर होना चाहिए। सरल, स्वच्छ और Android के रूप में इरादा। धन्यवाद।
लाइर इलुज़

2
"Android का उपयोग करना: KeepScreenOn =" सत्य "FLAG_KEEP_SCREEN_ON का उपयोग करने के बराबर है। आप अपने ऐप के लिए जो भी दृष्टिकोण का उपयोग कर सकते हैं। ध्वज को आपकी गतिविधि में प्रोग्रामेटिक रूप से सेट करने का लाभ यह है कि आपको बाद में और बाद में ध्वज को साफ़ करने का विकल्प देता है। इस तरह स्क्रीन को बंद करने की अनुमति मिलती है "- developer.android.com/training/scheduling/wakelock.html
Antonino

ध्यान दें कि दिखाई देने पर setKeepScreenOn(true)ही वसीयत प्रभावी होगी View
जेफ टी।

121

मुझे एक और काम करने वाला समाधान मिला: ऑनक्रिएट इवेंट के तहत अपने ऐप में निम्न लाइन जोड़ें।

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

मेरा नमूना कॉर्डोवा परियोजना इस तरह दिखता है:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

उसके बाद, मेरा ऐप खुला रहने पर सो नहीं जाएगा। Awer के लिए धन्यवाद xSus को जाता है।


मेरी राय में यह सबसे अच्छा विकल्प था ... +1
अमित

यह वैटेक के उत्तर के समान है, एकमात्र अंतर यह है कि आपने इसे ".java" फ़ाइल में ".xml" एक, ;-)
tiktak

अनुमति के बारे में कैसे? क्या इसके लिए अनुमति की आवश्यकता है?
मेहदी खड़मलू

@ मीदी खादिमेलो को इसकी अनुमति की आवश्यकता नहीं है।
वेसम एल महदी


17

नीचे दी गई गतिविधि की विंडो पर झंडे सेट करें

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

6

रूट शेल (उदाहरण के लिए शेल शेल) से, आप इसके साथ लॉक कर सकते हैं:

echo mylockname >/sys/power/wake_lock    

जिसके बाद डिवाइस तब तक जगी रहेगी, जब तक आप ऐसा नहीं करते:

echo mylockname >/sys/power/wake_unlock    

'Mylockname' के लिए समान स्ट्रिंग के साथ।

ध्यान दें कि यह स्क्रीन को काले होने से नहीं रोकेगा, लेकिन यह सीपीयू को सोने से रोकेगा।

ध्यान दें कि / sys / power / aw_lock उपयोगकर्ता रेडियो (1001) और समूह प्रणाली (1000) और निश्चित रूप से, रूट के लिए पढ़ा-लिखा है।

एक संदर्भ यहाँ है: http://lwn.net/Articles/479841/


3

@eldarerathis ने जो कहा वह सभी पहलुओं में सही है, वेक लॉक डिवाइस को नींद में जाने से रोकने का सही तरीका है।

मैं नहीं जानता कि वाह आपको ऐप करने की ज़रूरत है लेकिन यह वास्तव में महत्वपूर्ण है कि आप यह सोचें कि आपका ऐप कैसा है, ताकि आप फ़ोन को ज़रूरत से ज़्यादा जागते रहने के लिए मजबूर न करें, या बैटरी जीवन को भारी नुकसान होगा।

मैं आपको इस बात का सही उदाहरण दूंगाAlarmManager कि आग की घटनाओं का उपयोग कैसे करें और फोन और (आपका ऐप) को जगाने के लिए आपको क्या करना है और फिर से सो जाना चाहिए: अलार्म मैनेजर (स्रोत: commonsware.com)


विशेष रूप से और उद्देश्यपूर्ण रूप से बैटरी को खत्म करने के लिए उपयोगिता एप हैं। मुझे एक समय की आवश्यकता थी। मूल रूप से यह wakelocks अधिग्रहीत करेगा, पागल की तरह कांपना, टॉर्च चालू करना, चमक बढ़ाना, आदि। हां, ऐसे ऐप हैं जो इस का उपयोग करते हैं। लेकिन यह टॉपिक था इसलिए मुझे माफ कर दो
TheRealChx101

0

यदि आप एक Xamarin उपयोगकर्ता हैं, तो यह समाधान है:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.