java - alarm manager sometimes firing at wrong times -


i'm making app has 5 different notifications @ different times every day. works after beta testing users complaining alarm fire again @ wrong times haven't faced problem before , don't know how trace problem can fix it. how create alarm:

manager class:(which has functions of alarm)

public static integer default_silent_duration = 20 * 60 * 1000;     public static integer default_silent_start= 2 * 60 * 1000;      public manager(context applicationcontext) {          this.context = applicationcontext;     }      public static void acquirescreen(context context) {         powermanager pm = (powermanager) context.getapplicationcontext()                 .getsystemservice(context.power_service);         wakelock wakelock = pm                 .newwakelock(                         (powermanager.screen_bright_wake_lock                                 | powermanager.full_wake_lock | powermanager.acquire_causes_wakeup),                         "tag");         wakelock.acquire();         log.v("check manager acquirescreen","yes");     }      public static void releasescreen(context context) {         keyguardmanager keyguardmanager = (keyguardmanager) context                 .getapplicationcontext().getsystemservice(                         context.keyguard_service);         keyguardlock keyguardlock = keyguardmanager.newkeyguardlock("tag");         keyguardlock.disablekeyguard();         log.v("check manager releasescreen","yes");     }      public static void initprayeralarm(service service,             class<prayerreceiver> receiver) {          manager.prayerservice = service; // may need ?         manager.prayerintet = new intent(service, receiver);         manager.prayerpendingintent = pendingintent                 .getbroadcast(service, 1234432, manager.prayerintet,                         pendingintent.flag_update_current);         manager.prayeralarmmanager = (alarmmanager) service                 .getsystemservice(context.alarm_service);         manager.prayeralarmmanager.set(alarmmanager.rtc_wakeup,                 system.currenttimemillis() + 1000, manager.prayerpendingintent);         log.v("check manager initprayeralarm",""+system.currenttimemillis() + 1000);     }      public static void updateprayeralarm(long newtimeinterval) {          manager.prayeralarmmanager.set(alarmmanager.rtc_wakeup,                 system.currenttimemillis() + newtimeinterval,                 manager.prayerpendingintent);         log.v("check manager updateprayeralarm",""+system.currenttimemillis() + newtimeinterval);     }  public void restartprayerservice(activity activty) {          intent intent = new intent(activty, prayerservice.class);         context.startservice(intent);         log.v("check manager restartprayerservice","yes");     } 
  • in mainactivity call manager restartprayerservice function
  • in prayerservice call below:

manager.initprayerstate(this); manager.initprayeralarm(this, prayerreceiver.class);

and register receiver.

prayerreceiver:

public class prayerreceiver extends broadcastreceiver {  static prayerstate prayerstate; private audiomanager am; private context context; private sharedpreferences pref; private editor editor; private int silentduration; private int silentstart ; private int delaymilliseconds = 1000 * 60;  // 1 minute default. private object obj;   @override public void onreceive(context context, intent intent) {         this.context = context;         pref = preferencemanager.getdefaultsharedpreferences(this.context);      manager m = new manager(context);     preference p = m.getpreference();     this.silentduration = p.getsilentduration();     this.silentstart = p.getsilentstart();     editor = pref.edit();     try {          prayerstate = manager.getprayerstate();         = (audiomanager) context.getsystemservice(context.audio_service);         switch (prayerstate.getcurrentstate()) {          case prayerstate.waiting_azan:             {                 log.v("check prayerreceiver prayerstate","waiting_azan");                 onwaitingazan();              }              break;         case prayerstate.doing_azan:             {                  log.v("check prayerreceiver prayerstate","doing_azan");                 ondoingazan();             }             break;          case prayerstate.waiting_prayer:             {                 log.v("check prayerreceiver prayerstate","waiting_prayer");                 onwaitingprayer();             }              break;          }      } catch (exception e) {         // todo auto-generated catch block          log.v("check prayerreceiver prayerstate","error");       }      }       public int getdelaymilliseconds() {          return delaymilliseconds;     }      public void setdelaymilliseconds(int delaymilliseconds) {           this.delaymilliseconds = delaymilliseconds;     }      private void onwaitingazan() {      try {           boolean isringermodechangedtosilent = pref.getboolean(                 "isringermodechangedtosilent", false);         if (isringermodechangedtosilent == true) {             am.setringermode(audiomanager.ringer_mode_normal);             editor.putboolean("isringermodechangedtosilent", false);             editor.commit();         }          // remaining time until next prayer ?         date date = new date();         int dd = date.getdate();         int mm = date.getmonth() + 1;         int yy = date.getyear() + 1900;         int h = date.gethours();         int m = date.getminutes();         int s = date.getseconds();         int nearestprayertime = manager.computenearestprayertime(context,                 h, m, s, yy, mm, dd);         int defftime = timehelper.different((h * 3600 + m * 60 + s),                 nearestprayertime);         defftime = defftime * 1000; // milliseconds          // ok , come after x seconds azan         prayerstate.setnextstate(prayerstate.doing_azan);          manager.updateprayeralarm(defftime);       } catch (exception e) {          log.v("check prayerreceiver onwaitingazan","error");       }     }      private void ondoingazan() {      prayerstate.setnextstate(prayerstate.waiting_prayer);     int delay = this.silentstart;     if(delay < 2000*60)         delay =2000*60; // 2 minutes  - @ lease       log.v("check prayerreceiver ondoingazan","delay "+delay);     manager.playazannotification(context);      manager.updateprayeralarm(delay);        }      private void onwaitingprayer() {      manager manager = new manager(this.context);     preference preference = manager.getpreference();     audiomanager = (audiomanager)context.getsystemservice(context.audio_service);     if(am.getringermode() == audiomanager.ringer_mode_normal && preference.isautosilentdisabled()==false ){         am.setringermode(audiomanager.ringer_mode_silent);         editor.putboolean("isringermodechangedtosilent", true);         editor.commit();     }      this.delaymilliseconds = silentduration;     prayerstate.setnextstate(prayerstate.waiting_azan);      manager.updateprayeralarm(delaymilliseconds);      } 

can 1 please me,exactly doing wrong?

manager.prayeralarmmanager.set not set exact on specified time on api 19 , above. why "some" users complain.

note: beginning api 19 (kitkat) alarm delivery inexact: os shift alarms in order minimize wakeups , battery use. there new apis support applications need strict delivery guarantees; see setwindow(int, long, long, pendingintent) , setexact(int, long, pendingintent). applications targetsdkversion earlier api 19 continue see previous behavior in alarms delivered when requested.

on api 19 , above need setexact schedule @ specific time

you need this:

if(android.os.build.version.sdk_int >= 19) { // setexact } else {     //set } 

Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -