2015-09-10 9 views
34

मैं Google Play पर दो अलार्म घड़ी ऐप्स का डेवलपर हूं। मैं उन्हें एंड्रॉइड 6.0 के साथ काम करने की कोशिश कर रहा हूं। हालांकि, डोज़ मोड इसे बनाता है ताकि वे रिंग न करें। मैंने उन्हें सफेद सूची में रखा, मैंने एक अग्रभूमि अधिसूचना आइकन रखा, मुझे यकीन नहीं है कि मैं और क्या कर सकता हूं - जब डोज़ मोड में, अलार्म प्रबंधक अलार्म अभी भी अनदेखा कर रहे हैं। क्लॉक ऐप (जो एओएसपी ऐप की बजाय Google Play है), हालांकि, अलग है। जब क्लॉक ऐप पर अलार्म सक्षम होता है, तो "adb deviceidle step" हमेशा "सक्रिय" पढ़ेगा और कभी भी "निष्क्रिय", "idle_pending" या कुछ और नहीं पढ़ेगा।डोज़ मोड में एंड्रॉइड 6.0 के दौरान अलार्म प्रबंधक कैसे काम करें?

क्या एंड्रॉइड यहां धोखा दे रहा है, अपना ऐप अधिक शक्ति, उर्फ ​​दे रहा है। "एक सेब खींच रहा है"? क्या Google Play पर सभी अलार्म घड़ी ऐप्स गैर-कार्यात्मक बनने वाले हैं? यहां चिंतित होने के कारण, ये गुणवत्ता वाले ऐप्स हैं जिन्हें प्रत्येक ने अंशकालिक विकास के समय का एक वर्ष लिया, और मेरे लिए बड़े आय स्रोत हैं। इस बात पर कोई संकेत है कि मैं इन्हें कैसे काम कर सकता हूं, यह एक बड़ी मदद होगी।

AlarmManager आशय की स्थापना:

 Intent intent = new Intent(context, ReceiverAlarm.class); 
     if (android.os.Build.VERSION.SDK_INT >= 16) { 
      intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); 
     } 
     amSender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); //FLAG_CANCEL_CURRENT seems to be required to prevent a bug where the intent doesn't fire after app reinstall in KitKat 
     am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, scheduleToTime+1, amSender); 

और ReceiverAlarm वर्ग:

public class ReceiverAlarm extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (wakeLock == null) { 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle); 
     wakeLock.acquire(); 
    } 
    X.alarmMaster.startRingingAlarm(true); 
} 

और X.alarmMaster.startRingingAlarm के प्रासंगिक भागों() विधि:

if (wakeLock == null) { 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle); 
     wakeLock.acquire(); 
    } 

    if (screenWakeLock == null) { 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     screenWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, Theme.appTitle+" scr"); 
     screenWakeLock.acquire(); 
    } 

    Intent alarmIntent = new Intent(Intent.ACTION_VIEW); 
    alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    alarmIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    alarmIntent.setClass(context, ActivityAlarmAlarm.class); 

    context.startActivity(alarmIntent); 

आसान पठनीयता के लिए कुछ तरीकों को इनलाइन चिपकाया गया है।

+0

कुछ के टुकड़े मदद कर सकते हैं अन्य लोगों के देखने कि क्या हो रहा है की सुविधा देता है। कृपया :-) – Nabin

+1

निश्चित रूप से, मैं अपनी प्रतिक्रिया संपादित करूंगा। वे 20k + कोड कोड हैं, इसलिए मैं उनमें से एक के लिए प्रासंगिक लाइनों को पोस्ट करने का प्रयास करूंगा। – user1908060

उत्तर

30

डोज़ और ऐप स्टैंडबाय निश्चित रूप से अलार्म और वाकेलॉक्स के संबंध में व्यवहार को बदलते हैं, लेकिन वे निश्चित रूप से आपके लिए दुनिया का अंत नहीं हैं!

क्या आपने set() के बजाय विधि setAlarmclock() विधि का उपयोग करने का प्रयास किया है? यह विशेष रूप से अलार्म घड़ियों के लिए डिज़ाइन किया गया है और डोज़ के माध्यम से कटौती करने में सक्षम हो सकता है। कुछ एडीबी आदेशों आप मैन्युअल रूप से Doze या एप्लिकेशन स्टैंडबाई मोड में एक फोन डाल करने के लिए उपयोग कर सकते हैं कर रहे हैं: https://developer.android.com/preview/features/power-mgmt.html

है कि आपके एप्लिकेशन को जगाने के लिए सक्षम नहीं है, वहाँ निश्चित पद्धति setExactAndAllowWhileIdle() से फोन जगाने के लिए डिज़ाइन किया गया है है कोई फर्क नहीं पड़ता कि क्या। सबसे खराब स्थिति परिदृश्य, आप इस विधि के साथ अपने ऐप को जगा सकते हैं और अगले अलार्म को शेड्यूल करने के लिए जागरूकता का उपयोग कर सकते हैं। https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo

+4

यह setAlarmClock() का उपयोग कर काम कर रहा प्रतीत होता है। जब मैं अपने ऐप को "adb shell deviceidle step" का उपयोग करके डोज मोड में सेट करने का प्रयास करता हूं, और अलार्म जल्द ही बज रहा होगा, यह मोड को सक्रिय में रखेगा। – user1908060

+2

यह सहायक है! लेकिन इस रिपोर्ट को https://code.google.com/p/android-developer-preview/issues/detail?id=2225 देखें कि 'सेट [सटीक] औरAllowWhileIdle() 'विधियां काम नहीं करती हैं। :-( – Jerry101

+0

https://plus.google.com/+AndroidDevelopers/posts/94jCkmG4jff इयान लेक में रिपोर्ट करता है कि आंतरिक निर्माण में, 'AndAllowWhileIdle() 'विधियों के दौरान आग लगती है जितनी अधिक आप डेवलपर पूर्वावलोकन की तुलना में अपेक्षा करेंगे 3. – Jerry101

1

श्वेत सूची में आवेदन रखो केवल Doze मोड में नेटवर्क की अनुमति देता है:

पढ़ने लायक एक और पृष्ठ पृष्ठभूमि काम और अलार्म के लिए अपने प्रवाह संचित्र के साथ इस ब्लॉग पोस्ट है। AlarmManager श्वेतसूची से प्रभावित नहीं है।

setExactAndAllowWhileIdle() विधि के लिए कृपया नीचे दिए गए विवरण को एसडीके से जांचें। यह फोन को डोज से नहीं जगाएगा।

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

+1

यह सही है। दस्तावेज़ों से: "श्वेतसूची वाले ऐप की नौकरियां और सिंक को स्थगित कर दिया गया है, और इसके नियमित अलार्ममेनगर अलार्म आग नहीं करते हैं।" –

+0

@UncaughtException तो मैं आज एंड्रॉइड 6 और 7 के लिए इसे कैसे संभाल सकता हूं? क्या आप कार्यान्वयन का कोई उदाहरण प्रदान कर सकते हैं? – ray20

9

शायद आप मदद: हमारे आवेदन 19 (किटकैट) के नीचे एक एपीआई स्तर को लक्ष्य

हैं, तो अनुसूचित अलार्म वास्तव में अलार्म समय में चलेंगे।किटकैट को लक्षित करने वाले अनुप्रयोगों के लिए या बाद में, अनुसूची को अचूक माना जाता है और सिस्टम वेक-अप को कम करने और बैटरी को बचाने के लिए अलार्म को फिर से ऑर्डर या समूह कर सकता है।

एपीआई स्तर 23 के बाद, Android विकास टीम थोड़ा आगे चला गया और मोड Doze एंड्रॉयड सिस्टम पर पेश किया गया था बैटरी की खपत कम करने के लिए जब डिवाइस पावर एडाप्टर, अविचल से अनप्लग है, और द्वारा नहीं किया जाता लंबे समय तक उपयोगकर्ता।

Doze प्रणाली जब तक डिवाइस खपत के मोड बाहर निकल जाता है या एक आवर्ती रखरखाव खिड़की लंबित नौकरियों निष्पादित करने के लिए चलाता है डिवाइस की वेक-अप आवृत्ति पृष्ठभूमि नौकरियों, नेटवर्क अद्यतन समन्वयनों टाल, और हमारे कीमती अलार्म को कम करने की कोशिश करेंगे, कुछ अलार्म, या नेटवर्क के साथ सिंक्रनाइज़ेशन। रखरखाव खिड़की fnishes बाद, उपकरण खपत के मोड में प्रवेश करेंगे फिर इस बीच उसे इस्तेमाल नहीं किया गया था:

enter image description here

खपत के मोड आपके आवेदन को प्रभावित होने की संभावना है और एक रखरखाव जब तक अपने अलार्म स्थगित होगा विंडो तब तक आती है जब तक आप सेट औरAllowWhileIdle() और setExactAndAllowWhileIdle() को गहरे निष्क्रिय स्थिति में अपने अलार्म के निष्पादन की अनुमति देने के लिए विधियों का उपयोग करते हैं।

इसके अलावा, समय की संख्या खपत के मोड रखरखाव खिड़की रन लंबे समय तक की निष्क्रियता के मामलों में लगातार कम हो जाएगा कि, इसलिए हमारे शेड्यूलिंग पर इस नए तंत्र के प्रभाव, में वृद्धि होगी इसलिए में और अधिक अप्रत्याशित घबराहट पैदा कर रहा अलार्म समय।

डोज मोड के दौरान अनुप्रयोगों को नेटवर्क तक पहुंचने की अनुमति नहीं है, वेक लॉक को अनदेखा किया जाता है और वाई-फ़ाई स्कैन निष्पादित नहीं होते हैं।

हम सटीक समय निर्धारण की जरूरत है और आप Marshmallow को निशाना बनाने या बाद में रहे हैं, तो हम नए setExactAndAllowWhileIdle() विधि एपीआई स्तर 23 में शुरू का उपयोग करेगा:

am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pending); 

सूचना:

एंड्रॉइड सिस्टम में ऐसी सुरक्षा है जो सटीक अलार्म के लिए दुर्व्यवहार को रोकती है जो अक्सर बंद हो जाती है। अलार्ममेनगर केवल डिवाइस को जागता है और प्रति मिनट एक अलार्म भेजता है, और कम शक्ति मोड में यह प्रत्येक 15 मिनट के रूप में कम हो सकता है।

आपके आवेदन किटकैट (एपीआई स्तर 19) और Marshmallow (एपीआई स्तर 23) के बीच एक संस्करण लक्षित करता है तो setExact विधि समय परिशुद्धता के लिए पर्याप्त है:

am.setExact(AlarmManager.RTC_WAKEUP, time, pending); 

लेकिन हम जाँच करने की आवश्यकता होगी इससे पहले कि हम इसे कॉल करने का प्रयास करें, विधियां मौजूद हैं; अन्यथा, पहले एपीआई स्तरों के तहत चलाने पर हमारा ऐप क्रैश हो जाएगा।

if (Build.VERSION.SDK_INT >= 23) { 
// Wakes up the device in Doze Mode 
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, 
pending); 
} else if (Build.VERSION.SDK_INT >= 19) { 
// Wakes up the device in Idle Mode 
am.setExact(AlarmManager.RTC_WAKEUP, time, pending); 
} else { 
// Old APIs 
am.set(AlarmManager.RTC_WAKEUP, time, pending); 
} 

यह ठीक सभी प्लेटफार्मों पर specifed समय हमारे अलार्म वितरित कर देगा: हमारी नई सटीक अलार्म कोड स्केच देता है।

Asynchronous android programming

+1

"यह हमारे प्लेटफॉर्म पर बिल्कुल निर्दिष्ट समय पर हमारे अलार्म को वितरित करेगा।" नहीं – PrisonMike

+0

setExactAndAllowWhileIdle विधि पूरी तरह से बेकार है। किसी भी अनुस्मारक आवेदन जो कुछ स्थितियों में 15 मिनट से भी कम समय में दो अलार्म को संभालने में असमर्थ है, आवेदन का एक बुरा बकवास है। कृपया, प्रतिबंधों के बिना अलार्म ट्रिगर करने का कोई अच्छा तरीका नहीं है? एक अनुस्मारक आवेदन की जरूरत है कि! – user3289695

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