java - AlarmManager responding at wrong time -
sorry if answered before, looked everywhere didn't proper solution
i using alarmmanager automatically fire notification @ 9am everyday, when try run on emulator executes immediately, , every half hour (31-32min precise) after instead of once @ 9am everyday.
any ideas why? appreciated.
code below:
public class home extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_bsheet); notificationalert(savedinstancestate); } private void notificationalert(bundle savedinstancestate) { alarmmanager manager; pendingintent pendingintent; intent intent=new intent(home.this, notify.class); manager=(alarmmanager)getsystemservice(alarm_service); pendingintent=pendingintent.getservice(home.this, 0, intent, 0); gregoriancalendar gcal = new gregoriancalendar(); gcal.set(calendar.hour_of_day, 9); gcal.set(calendar.minute, 0); gcal.set(calendar.second, 0); gcal.set(calendar.millisecond, 0); long inittime = gcal.gettimeinmillis(); manager.setrepeating(alarmmanager.rtc_wakeup, inittime, 24*60*60*1000, pendingintent); } } cheers,
edit: intention that, once app installed, fires alarm @ 9am. have put alarm in oncreate, im not sure if alarm being created everytime start app , weird happening when hide app... again insight appreciated!
manager.setrepeating(alarmmanager.rtc_wakeup, inittime, 24*60*60*1000, pendingintent); alarm manager fire immidiatly if inittime < system.currenttimemillis()
if time occurs in past, alarm triggered immediately, alarm count depending on how far in past trigger time relative repeat interval.
according code you've provided, gcal.gettimeinmillis() return millisecods corresponding today 9.00. if you'll try run code after time, inittime less current system time triggers immidiate run of alarmmanager.
to fix this, example, can add 1 day calendar before passing gcal.gettimeinmillis() if in past point tomorrow 9.00 let run tomorrows morning
update1
tried code , worked expected me - fired service every 10 seconds:
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); initmanager(); } private void initmanager() { alarmmanager manager; pendingintent pendingintent; intent intent = new intent(this, notifyservice.class); manager=(alarmmanager)getsystemservice(alarm_service); pendingintent=pendingintent.getservice(this, 0, intent, 0); long inittime = system.currenttimemillis() + 5000; manager.setrepeating(alarmmanager.rtc_wakeup, inittime, 10*1000, pendingintent); } however can use option: there alarmmanager.set() method can fire this
long runtime = /* calendar time + 24 hours in millis*/ manager.set(alarmmanager.rtc_wakeup, runtime, pendingintent); so fire service @ runtime. , in service invoke same method recalculated runtime day that:
public mainactivity extends activity{ protected oncreate(bundle bundle){ .... initmanager(); } private initmanager(){ ... long runtime = /* time of first alarm/notification/whatever develope */ intent intent = new intent(this, notifyservice.class); pendingintent=pendingintent.getservice(this, 0, intent, 0); manager.set(alarmmanager.rtc_wakeup, runtime, pendingintent); } } and service:
public notifyservice extends service{ ... public int onstartcommand(...){ ... /* stuff */ intent intent = new intent(getapplicationcontext(), notifyservice.class); pendingintent=pendingintent.getservice(this, 0, intent, 0); long runtime = /* recalculate according next time of firing service*/ manager.set(alarmmanager.rtc_wakeup, runtime, pendingintent); } }
so service register intent in alarmmanager everytime service fires.
Comments
Post a Comment