कैसे जांचें कि AlarmManager में पहले से ही अलार्म सेट है या नहीं?


182

जब मेरा ऐप शुरू होता है, तो मैं यह जांचना चाहता हूं कि कोई विशेष अलार्म (अलार्ममेनगर के माध्यम से पंजीकृत) पहले से सेट हो रहा है और चल रहा है या नहीं। Google के परिणाम इंगित करते हैं कि ऐसा करने का कोई तरीका नहीं है। क्या यह अभी भी सही है? नया अलार्म बनाने के लिए किसी भी कार्रवाई के पहले उपयोगकर्ता को सलाह देने के लिए मुझे यह जांच करने की आवश्यकता है। जो स्रोत आप यहां से डाउनलोड कर सकते हैं - - https://android.googlesource.com/platform/packages/apps/AlarmClock

या आप समय था जब दिए गए कार्य निष्पादित किया जाना चाहिए स्थापित करने की बात कर रहे हैं -

  0

कृपया जवाब यह है कि आपकी समस्या हल हो मान्य या अपने खुद के समाधान पोस्ट के लिए लगता है। 16 jan. 172017-01-16 22:13:53

-3

आप अलार्म घड़ी की बात कर रहे हैं धारणा http://developer.android.com/reference/android/app/AlarmManager.html

  0

उन्होंने इसका नाम बदलकर डेस्कक्लॉक कर दिया: http://android.git.kernel.org/?p=platform/packages/apps/DeskClock.git;a=summary 29 dec. 102010-12-29 18:41:20

  0

मैं अलार्ममेनगर का उपयोग करके अपने कोड में अलार्म सेट का जिक्र कर रहा हूं। मुझे यह जांचने के लिए कोई तरीका नहीं मिल रहा है कि अलार्म पहले से ही किसी विशेष उद्देश्य के लिए सेट है या नहीं। चूंकि कार्यक्रम उपयोगकर्ता को अलार्म सेट करने की अनुमति देता है और फिर ऐप बंद करता है, मैं जानना चाहता हूं कि ऐप कब खोला जाता है चाहे अलार्म सेट हो और 'दृष्टि से बाहर' चल रहा हो। 29 dec. 102010-12-29 19:41:19

  0

ऐसा लगता है कि अलार्ममेनगर वर्ग ऐसी कार्यक्षमता प्रदान नहीं करता है। यहां AlarmManager के स्रोत पर एक नज़र डालें - http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/app/AlarmManager.java यदि आप वास्तव में हताश हैं, तो आप इसे बढ़ा सकते हैं (या IAlarmManager को फिर से कार्यान्वित कर सकते हैं) और अपना खुद का अलार्म प्रबंधक बना सकते हैं। Overkill। 29 dec. 102010-12-29 20:18:28

  0

अद्यतन: मुझे एक और धागे से पता चला है कि निम्नलिखित नौकरी करने लगता है: - 30 dec. 102010-12-30 13:27:22

+6

अलार्म = (अलार्ममेनगर) सिस्टमसिंसर (Context.ALARM_SERVICE) प्राप्त करें; \t स्ट्रिंग ALARM_ACTION; ALARM_ACTION = AAAlarmReceiver.ACTION_LOAD_LISTVIEW; इरादा इरादा ToFire = नया इरादा (ALARM_ACTION); बूलियन अलार्मअप = (लंबित INTent.getBroadcast (cText, 0, intentToFire, लंबित INTent.FLAG_NO_CREATE)! = शून्य); 30 dec. 102010-12-30 13:27:40

  0

कृपया अपने उत्तर में केवल एक का जवाब दें। यदि आप कोई प्रश्न या कुछ और पूछना चाहते हैं, तो इसे टिप्पणी में रखें। 01 dec. 172017-12-01 10:39:08

  0

@RahatZaman आप किसके बारे में बात कर रहे हैं? मुख्य ढेर अतिप्रवाह दर्शन में से एक है 'एक आदमी को एक मछली दें और आप उसे एक दिन के लिए खिलाओ। एक आदमी को मछली के लिए सिखाओ और आप उसे जीवन भर के लिए खिलाओ '। तो, lib के स्रोत को इंगित करना यहां बहुत आम अभ्यास है। 05 dec. 172017-12-05 10:06:25


1

इम कि थेरेस ऐसा करने का कोई तरीका नहीं है, हालांकि यह अच्छा होगा।

आप कहीं भी रिकॉर्ड किए गए अलार्म_last_set_time के साथ एक समान परिणाम प्राप्त कर सकते हैं, और ऑन_बूट_स्टाटर ब्रॉडकास्ट रिसीवर: BOOT_COMPLETED थोड़ी सी बात है।


277

टिप्पणी रॉन पर पोस्ट करने के बाद, विस्तृत समाधान यहां दिया गया है।

Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
             intent, PendingIntent.FLAG_UPDATE_CURRENT); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.add(Calendar.MINUTE, 1); 

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60, pendingIntent); 

जिस तरह से आप को देखने के लिए जाँच करेगा अगर यह सक्रिय है करने के लिए है: मान लीजिए कि आप इस तरह एक लंबित इरादे के साथ एक दोहराई जाने वाली अलार्म पंजीकृत किया है चलो

boolean alarmUp = (PendingIntent.getBroadcast(context, 0, 
     new Intent("com.my.package.MY_UNIQUE_ACTION"), 
     PendingIntent.FLAG_NO_CREATE) != null); 

if (alarmUp) 
{ 
    Log.d("myTag", "Alarm is already active"); 
} 

कुंजी यहाँ FLAG_NO_CREATE है जो जैसा कि javadoc में वर्णित है: if the described PendingIntent **does not** already exists, then simply return null (एक नया निर्माण करने के बजाय)

+8

क्या इसे केवल एक एक्शन स्ट्रिंग के साथ इरादे का उपयोग करना है? मैंने एक वर्ग, नया इरादा (संदर्भ, MyClass.class) निर्दिष्ट करने का प्रयास किया लेकिन यह काम नहीं कर रहा है। जब अलार्म चल रहा है तब भी यह हमेशा शून्य हो जाता है। 04 apr. 122012-04-04 08:39:49

+5

toc777, इसे स्ट्रिंग होने की आवश्यकता नहीं है जो आपके मैनिफेस्ट में आपके इरादे-फ़िल्टर में घोषित कार्रवाई से मेल खाता है।xml 11 apr. 122012-04-11 08:27:24

+4

क्रिस, यह एक और मुद्दा था जो मेरी समस्या का कारण बन रहा था। ऊपर उल्लिखित इरादा वास्तव में काम करता है :) 12 apr. 122012-04-12 12:25:50

  0

एक मुद्दा जो मैंने अलार्म प्रबंधक और लंबित इंटेंट पर रद्द नहीं किया था। आईई ~ अलार्म Mgr.cancel (अलार्म इंटेंन्ट); alarmIntent.cancel(); 29 may. 142014-05-29 12:01:21

  0

@ChrisKnight: क्या यह अभी भी काम करेगा यदि मैं ऐप से जांचता हूं तो ऐप 1 अगर अलार्म सेट हो और ऐप 2 में चल रहा हो? और साथ ही, ऐप अपडेट के दौरान अलार्म मर जाते हैं, और इसलिए हमें इसे फिर से रीसेट करने की आवश्यकता है (ऐप अपडेट केस के लिए)? 08 jul. 142014-07-08 03:25:46

+1

हमेशा सत्य कहता है कि लंबित इरादा पहले से मौजूद है। ऐप अनइंस्टॉल करने और पुनः इंस्टॉल करने के बाद भी। लंबित इरादा कब तक रहता है? 13 aug. 142014-08-13 20:33:24

+30

ध्यान दें कि आप कॉल करने के लिए की आवश्यकता होगी दोनों '' 'alarmManager.cancel (pendingIntent)' '' और '' 'pendingIntent.cancel()' '' क्रम में इस समाधान झूठी वापस जाने के लिए के लिए। नई आशय (संदर्भ, YourService.class) का उपयोग कर उपयोगकर्ताओं के लिए 29 sep. 142014-09-29 20:00:44

+1

, आप आशय 28 nov. 142014-11-28 20:11:13

+1

Lifesaver पर कोई कार्य निर्धारित करने के लिए .setAction ("ACTIONNAME") का उपयोग कर सकते हैं। कृपया ध्यान दें कि झंडे को छोड़कर, आपको पहले जिस तरह से बनाया गया था, वैसे ही आपको इरादे को बनाने की आवश्यकता होगी। 26 feb. 152015-02-26 10:07:31

+22

यह मामला स्पष्ट नहीं है, इस उत्तर में कोड यह सत्यापित नहीं करता है कि लंबित इरादा अलार्म प्रबंधक के साथ पंजीकृत है। कोड बस सत्यापित करता है कि लंबित इंटेन्टेंट को समकक्ष लक्ष्य उद्देश्य के साथ GetBroadcast के माध्यम से बनाया गया था। आप GetBroadcast के बाद अलार्मअप कोड चलाकर इसे साबित कर सकते हैं, लेकिन सभी कैलेंडर और अलार्म प्रबंधक सामग्री से पहले। यह सच हो जाएगा। यह तथ्य बताता है कि आपको गलत पर वापस जाने के लिए मूल्य प्राप्त करने के लिए लंबित INTent.cancel क्यों है। कड़ाई से बोलते हुए, यह सवाल का जवाब नहीं देता है। 21 apr. 152015-04-21 21:09:49

+1

क्षमा करें। मैं पूछना चाहता हूं कि MY_UNIQUE_ACTION क्या है? यह कहां से आ रहा है? 23 jul. 152015-07-23 01:14:26

+1

@ लियोनार्ड फेब्रियनो मुझे लगता है कि यह एक लंबे समय से अतिदेय उत्तर था, लेकिन मुझे पूरा यकीन है कि आपको कारण मिला है। Thats सिर्फ कार्रवाई का नाम है, यह किसी भी कार्रवाई निरंतर आप अपने प्रकट 15 dec. 152015-12-15 05:49:51

  0

में रिसीवर के साथ संबद्ध कर दिया है हो सकता है काम नहीं करता है इस कोड 17 dec. 152015-12-17 13:55:17

+1

मैं आशय आशय की कोशिश की = नए प्रयोग करने से पहले द्वारा 'बलपूर्वक रोकने' आदि को मार डाला अलार्म .. यह रद्द कर दिया जाना चाहिए अगर इरादा (सीटीएक्स, MyReceiver.class); unique_action को पारित करने के बजाय और यह काम किया :) 22 dec. 152015-12-22 11:24:16

  0

ओह इसके कामकाजी धन्यवाद! भविष्य पाठकों के लिए 23 dec. 152015-12-23 03:46:33

+1

टिप - सुनिश्चित करें कि आप PendingIntent.getService साथ PendingIntent.getBroadcast (...) (...) भूल नहीं कर रहे हैं - अपने आप को कुछ परेशानी को बचाने! :) 18 apr. 162016-04-18 04:33:00

+2

यह पहली बार है जब मैं बहुत उच्च रेटेड WRONG उत्तर देखता हूं। Bigh_29 द्वारा टिप्पणी देखें। 03 jan. 172017-01-03 20:29:37


7

मेरे पास 2 अलार्म हैं। मैं कार्रवाई के बजाय अतिरिक्त के साथ आशय का उपयोग कर रहा घटनाओं की पहचान करने के:

Intent i = new Intent(context, AppReciever.class); 
i.putExtra("timer", "timer1"); 

बात यह है कि diff एक्स्ट्रा कलाकार के साथ आशय (और अलार्म) अभ्यस्त अद्वितीय होना है। पहचान करने के लिए जो अलार्म सक्रिय है या नहीं है सक्षम करने के लिए तो, मैं diff requestCode -s को परिभाषित करने के लिए किया था:

boolean alarmUp = (PendingIntent.getBroadcast(context, MyApp.TIMER_1, i, 
        PendingIntent.FLAG_NO_CREATE) != null); 

और यहाँ है कैसे अलार्म बनाया गया था:

public static final int TIMER_1 = 1; 
public static final int TIMER_2 = 2; 

PendingIntent pending = PendingIntent.getBroadcast(context, TIMER_1, i, 
      PendingIntent.FLAG_CANCEL_CURRENT); 
setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending); 
pending = PendingIntent.getBroadcast(context, TIMER_2, i, 
      PendingIntent.FLAG_CANCEL_CURRENT); 
setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending); 
  0

इरादा अतिरिक्त का उपयोग करना और यह समाधान मेरे लिए काम किया। केवल एक परिवर्तन मैं सेवा का उपयोग कर रहा हूँ ताकि मैं इसे 'PendingIntent.getService' 27 aug. 162016-08-27 10:07:25


92

दूसरों ने इस आवश्यकता हो सकती है के लिए, यहाँ एक जवाब है।

उपयोग adb shell dumpsys alarm

आप पता कर सकते हैं अलार्म सेट कर दिया गया है और जब वे चिंतित और अंतराल के लिए जा रहा। यह अलार्म कितनी बार लागू किया गया है।

+4

को बदल दिया है इस सही जवाब 04 oct. 142014-10-04 22:07:13

+1

यह ठीक 09 dec. 142014-12-09 12:43:14

+24

नहीं वास्तव में ओ पी करने के लिए एक कार्यक्रम संबंधी जवाब है, बल्कि एक बेहतरीन टिप होना चाहिए। जानना बहुत अच्छा है। 06 may. 152015-05-06 17:38:12

+1

आम तौर पर अलार्म की लंबी सूची फ़िल्टर करने के लिए एक grep संलग्न करें: 'adb shell dumpsys अलार्म | grep <उदा। आपके ऐप का पैकेज नाम> 'नए विंडोज सिस्टम पर भी काम करता है (मैं Win10 का उपयोग करता हूं) 08 aug. 162016-08-08 10:51:30

+2

grep मोबाइल डिवाइस पर निष्पादित किया गया है, न कि आपके पीसी पर। तो अगर grep काम करता है तो एंड्रॉइड ओएस पर निर्भर करता है। पुराने फोन grep के साथ नहीं आते हैं। 07 mar. 172017-03-07 13:15:26


36

रिसीवर के साथ कार्य उदाहरण (शीर्ष उत्तर केवल कार्रवाई के साथ था)।

//starting 
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(getActivity(), MyReceiver.class); 
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//my custom string action name 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//used unique ID as 1001 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), aroundInterval, pendingIntent);//first start will start asap 

//and stopping 
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up 
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//the same as up 
alarmManager.cancel(pendingIntent);//important 
pendingIntent.cancel();//important 

//checking if alram is working with pendingIntent 
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up 
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up 
boolean isWorking = (PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag 
Log.d(TAG, "alarm is " + (isWorking ? "" : "not") + " working..."); 

मैं भी पर मेरी blog

+1

मुझे यकीन नहीं है कि यह पर्याप्त है। ऐसे मामले में जहां एक लंबित इंटेंटेंट अलार्ममेनगर के साथ पंजीकृत है और फिर रद्द करने के तरीकों से रोक दिया गया है, ऊपर 'isWorking' अभी भी सत्य होगा। ऐसा लगता है कि लंबित इंटेंट को अलार्ममेनगर से हटाया नहीं गया है, और एक उदाहरण लौटाएगा। अलार्म को चालू/बंद होने पर हम प्रभावी ढंग से कैसे जानते हैं? 10 jun. 162016-06-10 07:36:29

  0

यह वास्तव में पूरी तरह से काम किया। ध्यान देने योग्य बातें: setAction() और requestCode() को सभी getBroadcast() में और आपके डिवाइस से ऐप को अनइंस्टॉल करने के लायक होने की आवश्यकता है। उसने मुझे पकड़ा। धन्यवाद 11 jun. 162016-06-11 10:12:42

  0

अच्छा काम करता है। धन्यवाद! 01 sep. 162016-09-01 12:59:48

  0

अच्छा उदाहरण है लेकिन मैं वहां 1001 का निजी अनुरोध कोड के रूप में उपयोग नहीं करता। उदाहरण को और स्पष्ट बनाने के लिए बस 0। 09 jul. 172017-07-09 08:12:57


29

नोट अलार्म प्रबंधक के लिये दस्तावेज से इस बोली का वर्णन किया है:

यदि पहले से ही (इस आशय अनुसूचित के लिए एक अलार्म साथ है Intent.filterEquals द्वारा परिभाषित किए जाने वाले दो उद्देश्यों की समानता), तो यह हटा दिया जाएगा और इसे बदल दिया जाएगा।

यह पूछने से परेशान न हों कि अलार्म मौजूद है या नहीं, अगर आप यह तय करने की कोशिश कर रहे हैं कि अलार्म बनाना है या नहीं। हर बार जब आपका ऐप बूट हो जाए तो इसे बनाएं। आप कॉन्फ़िगर किए गए किसी भी पिछले अलार्म को प्रतिस्थापित करेंगे।

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

  0

मेरी राय में यह स्वीकार्य उत्तर होना चाहिए। जब तक ओपी एक विशेष स्थिति है कि अलार्म 19 may. 162016-05-19 16:11:12

  0

restating नहीं सही ठहराते मेरे मामले में है, मुझे पता है कि अगर अलार्म पहले से ही सेट किया गया है चाहते हैं और यदि ऐसा है तो मैं नया बना या मौजूदा अलार्म पुनर्स्थापित करने के लिए नहीं करना चाहती। 21 jul. 172017-07-21 14:00:12


3

मैंने एक साधारण (बेवकूफ या नहीं) बैश स्क्रिप्ट बनाई है, जो एडब शैल से लंबे समय तक निकालती है, उन्हें टाइमस्टैम्प में बदल देती है और इसे लाल रंग में दिखाती है।

echo "Please set a search filter" 
read search 

adb shell dumpsys alarm | grep $search | (while read i; do echo $i; _DT=$(echo $i | grep -Eo 'when\s+([0-9]{10})' | tr -d '[[:alpha:][:space:]]'); if [ $_DT ]; then echo -e "\e[31m$(date -d @$_DT)\e[0m"; fi; done;) 

यह कोशिश;)


2
Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION"); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(
        sqlitewraper.context, 0, intent, 
        PendingIntent.FLAG_NO_CREATE); 

FLAG_NO_CREATE आशय लंबित इतना है कि यह बूलियन मान झूठी देता है का निर्माण नहीं कर रहा है।

  boolean alarmUp = (PendingIntent.getBroadcast(sqlitewraper.context, 0, 
        new Intent("com.my.package.MY_UNIQUE_ACTION"), 
        PendingIntent.FLAG_NO_CREATE) != null); 

      if (alarmUp) { 
       System.out.print("k"); 

      } 

      AlarmManager alarmManager = (AlarmManager) sqlitewraper.context 
        .getSystemService(Context.ALARM_SERVICE); 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
        System.currentTimeMillis(), 1000 * 60, pendingIntent); 

AlarmManager के बाद विचाराधीन का मूल्य जाँच आशय यह कारण लंबित आशय का AlarmManager अद्यतन करें सच देता है।

  boolean alarmUp1 = (PendingIntent.getBroadcast(sqlitewraper.context, 0, 
        new Intent("com.my.package.MY_UNIQUE_ACTION"), 
        PendingIntent.FLAG_UPDATE_CURRENT) != null); 
      if (alarmUp1) { 
       System.out.print("k"); 

      } 

5

बस एक और समाधान नहीं मिला है, यह काम करने के लिए मुझे

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class); 

boolean isWorking = (PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_NO_CREATE) != null); 
if (isWorking) {Log.d("alarm", "is working");} else {Log.d("alarm", "is not working");} 

if(!isWorking) { 
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    int timeNotif = 5 * 60 * 1000;//time in ms, 7*24*60*60*1000 for 1 week 
    Log.d("Notif", "Notification every (ms): " + timeNotif); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), timeNotif, pendingIntent); 
    } 
  0

कभी-कभी, मार्शमलो पर, एक ऐप को मजबूर करने के बाद, getBroadcast() गैर-शून्य वापस आ जाएगा, लेकिन अलार्म सेट नहीं है। 15 feb. 182018-02-15 20:14:10