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
Post a Comment