दिलचस्प पोस्ट
मैं अपने डीएलएल इंटरफ़ेस या एबीआई में स्टैंडर्ड लाइब्रेरी (एसटीएल) कक्षाओं का उपयोग कैसे कर सकता हूं? सही पीएएचटीएच में कॉल करने के लिए कैसे क्रॉन प्राप्त करें I हेडर के साथ सी # में सीएसवी फ़ाइलों को पार्स करना जीडीबी में सी ++ वेक्टर के तत्वों को कैसे मुद्रित कर सकता हूं? एंड्रॉइड के लिए नवीनतम ओपनएसएसएल संकलित करना जावास्क्रिप्ट में ऑब्जेक्ट्स को सीरियललाइज़ / अनसियलाइज़ करने का सबसे अच्छा तरीका? मैं कोको टच के साथ सप्ताह के दिन कैसे प्राप्त करूं? उपयोगकर्ता-परिभाषित फ़ंक्शन पर टूलटिप कैसे डालया जाए क्या ffmpeg एक प्रगति बार दिखा सकता है? विभाजित स्क्रीन emacs windows का आकार कैसे बदल सकता है? सी में संकेतक: जब ऐपरसैंड और तारांकन का उपयोग करें? IE9 + में CSS3 एनिमेशन का उपयोग करना खंड पर रीस्यूम () और ऑन पॉज़ () बैकस्टैक पर नहीं बुलाया गया है java: यह क्या है: [Ljava.lang.Object ;? IOS में किसी NSDate ऑब्जेक्ट में दिनांक स्ट्रिंग को कैसे पार्स करना है?

अलार्ममैनेजर गलत समय पर अलार्म चलाता है

अलार्म के परिणामस्वरूप एक अधिसूचना को आगाने के लिए उपयोग की जाने वाली अधिसूचना सेवा का निर्माण करने के लिए मैंने हर चीज का प्रबंधन किया। दुर्भाग्य से, अलार्म मैनेजर का उपयोग कर अलार्म सेट करना सही काम नहीं करता है। यह कई मिनट बाद में आग लगती है (ठीक समय नहीं, जो टाइमज़न समस्या का संकेत देगा)। आवर्ती अवधि 1 सप्ताह है, इसलिए मैंने निरंतर INTERVAL_DAY का उपयोग किया और इसे 7 के साथ गुणा किया। यह सुनिश्चित करने के लिए कि एक लंबित व्यक्ति अन्य की जगह नहीं लेता है, मैं दिन के लिए दूसरा पैरामीटर pendingIntent.getService () के रूप में पास करता हूं। मैं लॉगिंग करके अलार्म के लिए समय की शुद्धता की जांच करता हूं:

Log.d(TAG, "next alarm " + df.format(cal.getTime())); 

क्या सभी अलार्म सेट करने के लिए वास्तव में कोई रास्ता नहीं है – कम से कम मेरे खुद के ऐप से? मेरा मानना ​​है कि यह त्रुटि को ट्रैक करने का एकमात्र तरीका है

मेरा कोड:

 cal.setTimeInMillis(System.currentTimeMillis()); cal.add(Calendar.DATE, 1); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, minute); Log.d(TAG, "next alarm " + df.format(cal.getTime())); Intent showNotificationIntent = new Intent(context, NotificationService.class); dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); alarmIntent = PendingIntent.getService(context, dayOfWeek, showNotificationIntent, 0); getAlarmManager(context).setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), INTERVAL_WEEK, alarmIntent); 

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

इसी तरह के सवालों के कई जवाब पढ़ने के बाद भी (मैं एक डुप्लिकेट सवाल बनाने का इरादा नहीं है), मैं समस्या को खोजने में कामयाब नहीं है।

वेब के समाधान से एकत्रित समाधान "अलार्ममैनेजर गलत समय पर अलार्म चलाता है"

एपीआई के स्तर के लिए 1 9 से नीचे आपको अलार्म AlarmManager.setRepeating() उपयोग करना चाहिए और आपके अलार्म निश्चित समय पर बिल्कुल ट्रिगर करेगा। आप एपीआई स्तरों पर 1 9 और इससे ऊपर अब काम नहीं करेंगे। एंड्रॉइड में बदलाव हुआ था ताकि सभी दोहराए जाने वाले अलार्म अयोग्य हो। इसलिए यदि आप सटीक दोहराए जाने वाले अलार्म प्राप्त करना चाहते हैं तो आपको अलार्म AlarmManager.setExact() साथ अलार्म शेड्यूल करना चाहिए और फिर जब अगले सप्ताह अलार्म ट्रिगर करता है और हर सप्ताह ऐसा होता है

सेटइंक्सएक्ट रीपीटिंग के कारण सेट पुन: प्रयोग करें और इसे सही समय पर संसाधित किया जाएगा।

के बजाय:

 setInexactRepeating 

उपयोग

 setRepeating 

setInexactRepeating, ओएस और बैटरी अनुकूल है, यह अलार्म पर प्राप्त किए जाने वाले सभी कार्यों को एक साथ बैच करता है और एक-एक के माध्यम से काम करता है, जबकि सेट के रूप में सेटिंग तुरंत अलार्म को निकालती है

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

एक छोटा सा उदाहरण:

यह कोड काम कर रहा है यह फोन हर 10 मिनट तक बंद हो जाता है जब तक फोन बंद नहीं हो जाता।

Manifest.xml में जोड़ें:

 ... <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> ... <receiver android:process=":remote" android:name="Alarm"></receiver> ... 

कोड:

  package YourPackage; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.PowerManager; import android.widget.Toast; public class Alarm extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); wl.acquire(); // Put here YOUR code. Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example wl.release(); } public void SetAlarm(Context context) { AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(context, Alarm.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute } public void CancelAlarm(Context context) { Intent intent = new Intent(context, Alarm.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } } 

सेवा से अलार्म सेट करें:

 package YourPackage; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; public class YourService extends Service { Alarm alarm = new Alarm(); public void onCreate() { super.onCreate(); } public void onStart(Context context,Intent intent, int startId) { alarm.SetAlarm(context); } @Override public IBinder onBind(Intent intent) { return null; } } 

यदि आप फ़ोन बूट समय पर दोहराए जाने वाले अलार्म सेट करना चाहते हैं:

Manifest.xml को अनुमति जोड़ें:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> ... <receiver android:name=".AutoStart"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> ... 

और नया वर्ग बनाएं:

 package YourPackage; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class AutoStart extends BroadcastReceiver { Alarm alarm = new Alarm(); @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { alarm.SetAlarm(context); } } }