java - Service gets killed even with notification. Needs to stay forever -
i have app in count number of steps taken user , show in notification forever. have created notification , set startforeground(true). after service gets killed after time. want notification there long app installed. app called pacer (https://play.google.com/store/apps/details?id=cc.pacer.androidapp) does.
the reason @ midnight everyday send data server triggered service only.
also have never seen pacer apps notification getting killed. how that.?
here service class.
public class stepcounterservice extends service implements sensoreventlistener, steplistener, webserviceinterface, googleapiclient.connectioncallbacks, googleapiclient.onconnectionfailedlistener, locationlistener { session session; localbroadcastmanager broadcaster; sensormanager sensormanager; sensor sensor; stepdetector stepdetector; notificationmanager notificationmanager; remoteviews contentview; googleapiclient googleapiclient; locationrequest mlocationrequest; alarmmanager sendactivityalarmmanager; pendingintent activityalarmintent; double currentlatitude; double currentlongitude; static final int main_notification_id = 1; private int set_last_location_request_code = 2; appusermodel appuser; static final public string step_increment = "com.fimo.step_incremented"; static final public string session_complete = "com.fimo.session_complete"; static final public string activity_complete = "com.fimo.activity_complete"; static final public string step_increment_key = "step_count"; private boolean issessionon; int startingsteps = 0; int endingsteps = 0; private int numberofsteps = 0; private long no_step_interval = 5000; notification notification; @nullable @override public ibinder onbind(intent intent) { return null; } @override public int onstartcommand(intent intent, int flags, int startid) { // todo auto-generated method stub session = new session(this); updatemainnotification(session.gettodaysteps() + ""); startforeground(main_notification_id, notification); return start_sticky; } @override public void oncreate() { super.oncreate(); session = new session(this); buildgoogleapiclient(); broadcaster = localbroadcastmanager.getinstance(this); sensormanager = (sensormanager) getsystemservice(sensor_service); sensor = sensormanager.getdefaultsensor(sensor.type_accelerometer); stepdetector = new stepdetector(); stepdetector.registerlistener(stepcounterservice.this); sensormanager.registerlistener(this, sensor, sensormanager.sensor_delay_fastest); notificationmanager = (notificationmanager) getsystemservice(activity.notification_service); contentview = new remoteviews(getpackagename(), r.layout.view_notification); contentview.setimageviewresource(r.id.image, r.drawable.notification); gson gson = new gson(); appuser = gson.fromjson(session.getappuser(), appusermodel.class); if (appuser != null) updatemainnotification(session.gettodaysteps() + ""); startalarm(); } public void sendstepincrementbroadcast(int numberofsteps) { intent intent = new intent(step_increment); intent.putextra(step_increment_key, numberofsteps); broadcaster.sendbroadcast(intent); } @override public void onsensorchanged(sensorevent event) { if (event.sensor.gettype() == sensor.type_accelerometer) { stepdetector.updateaccel(event.timestamp, event.values[0], event.values[1], event.values[2]); } } @override public void onaccuracychanged(sensor sensor, int accuracy) { } @override public void getresponse(int responsecode, string responsestring, string requesttype, int requestcode) { } @override public void step(long timens) { if (!issessionon) startingsteps = session.gettodaysteps(); issessionon = true; numberofsteps = session.gettodaysteps(); numberofsteps++; sendstepincrementbroadcast(numberofsteps); session.settodaysteps(numberofsteps); if (appuser != null) updatemainnotification(numberofsteps + ""); else { try { notificationmanager.cancel(main_notification_id); } catch (exception e) { } } countdowntimer.cancel(); countdowntimer.start(); } countdowntimer countdowntimer = new countdowntimer(no_step_interval, 1000) { public void ontick(long millisuntilfinished) { } public void onfinish() { endingsteps = session.gettodaysteps(); issessionon = false; int numberofsteps = endingsteps - startingsteps; intent intent = new intent(); intent.addflags(intent.flag_include_stopped_packages); intent.setaction(session_complete); intent.putextra("sessionsteps", numberofsteps); sendbroadcast(intent); } }; @override public void onconnected(@nullable bundle bundle) { location location = null; if (activitycompat.checkselfpermission(this, manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) { return; } location = locationservices.fusedlocationapi.getlastlocation(googleapiclient); if (location == null) { locationservices.fusedlocationapi.requestlocationupdates(googleapiclient, mlocationrequest, this); } else { currentlatitude = location.getlatitude(); currentlongitude = location.getlongitude(); setlastlocation(currentlatitude, currentlongitude); } } @override public void onconnectionsuspended(int i) { } @override public void onconnectionfailed(@nonnull connectionresult connectionresult) { } @override public void onlocationchanged(location location) { currentlatitude = location.getlatitude(); currentlongitude = location.getlongitude(); setlastlocation(currentlatitude, currentlongitude); } protected synchronized void buildgoogleapiclient() { googleapiclient = new googleapiclient.builder(this) .addconnectioncallbacks(this) .addonconnectionfailedlistener(this) .addapi(locationservices.api) .build(); googleapiclient.connect(); mlocationrequest = locationrequest.create() .setpriority(locationrequest.priority_high_accuracy) .setinterval(10 * 1000) // 10 seconds, in milliseconds .setfastestinterval(1 * 1000); } private void startalarm() { sendactivityalarmmanager = (alarmmanager) this.getsystemservice(context.alarm_service); intent intent = new intent(this, activitycompletereceiver.class); activityalarmintent = pendingintent.getbroadcast(this, 0, intent, 0); calendar calendar = calendar.getinstance(); calendar.settimeinmillis(system.currenttimemillis()); calendar.set(calendar.hour_of_day, generaterandomtime()[0]); calendar.set(calendar.minute, generaterandomtime()[1]); // calendar.set(calendar.hour_of_day, 02); // calendar.set(calendar.minute, 19); if (system.currenttimemillis() > calendar.gettimeinmillis()) { calendar.add(calendar.day_of_year, 1); } sendactivityalarmmanager.setrepeating(alarmmanager.rtc_wakeup, calendar.gettimeinmillis(), alarmmanager.interval_day, activityalarmintent); } private int[] generaterandomtime() { int[] timeintegers = new int[2]; final random r = new random(); timeintegers[0] = r.nextint(54 - 50) + 54; timeintegers[1] = r.nextint(59 - 1) + 1; return timeintegers; } private void updatemainnotification(string stepsvalue) { string title = "today: " + stepsvalue + " steps - " + linksandkeys.decimalformat.format(getdatafromsteps(session.gettodaysteps())[1]) + " fimos"; string message = "keep walking , keep earning"; contentview.settextviewtext(r.id.textviewtitle, title); contentview.settextviewtext(r.id.textviewmessage, message); intent notificationintent = new intent(stepcounterservice.this, splashactivity.class); notificationintent.setflags(intent.flag_activity_clear_top | intent.flag_activity_single_top); pendingintent intent = pendingintent.getactivity(stepcounterservice.this, 0, notificationintent, 0); notificationcompat.builder mbuilder = new notificationcompat.builder(this) .setsmallicon(r.drawable.running) .setongoing(true) .setcontent(contentview) .setcontentintent(intent); notification = mbuilder.build(); notification.flags |= notification.flag_ongoing_event; startforeground(main_notification_id, notification); } }
how keep service on forever , keep notification on app pacer (https://play.google.com/store/apps/details?id=cc.pacer.androidapp)
Comments
Post a Comment