Android appwidget does not start service when ran -
the problem having when debug widget, changes layout, when run it, doesn't work. according debug messages, sets setonclickpendingintent not start service.
in short, widget works when debugging.
here widget code:
public class widget extends appwidgetprovider { public static string switch_screen1 = "1"; public static string switch_screen2 = "2"; public static final string add_note = "addnote"; public static final string manage_reminders = "managereminders"; public static string take_picture = "takepicture"; private static int layoutid = r.layout.widget_screen1; /** * method called when widget added home screen. * sets listeners on items , updates screen info database */ @override public void onenabled(context context) { super.onenabled(context); setlisteners(context); updatescreenfromdatabase(context, appwidgetmanager.getinstance(context), appwidgetmanager.getinstance(context).getappwidgetids(new componentname(context, widget.class))); } /** * method called update widget. widget called when timeout set in widget.xml occurs. */ @override public void onupdate(context context, appwidgetmanager appwidgetmanager,int[] appwidgetids) { super.onupdate(context, appwidgetmanager, appwidgetids); updatescreenfromdatabase(context, appwidgetmanager, appwidgetids); } /** * method fetches data database , puts in 2 text elements on screen * @param context * @param appwidgetmanager * @param appwidgetids */ private static void updatescreenfromdatabase(context context, appwidgetmanager appwidgetmanager,int[] appwidgetids) { if(layoutid == r.layout.widget_screen1){ remoteviews views = new remoteviews(context.getpackagename(), layoutid); for(int = 0 ; < appwidgetids.length ; i++){ string currentlesson = "no current lesson"; string nextlesson = "no next lesson"; lessonhour[] hours = database.getinstance(context).getcurrentandnextlessonhour(); if(hours[0] != null){ currentlesson = hours[0].getstart().get(gregoriancalendar.hour_of_day) + ":" + utils.adjustminutes(hours[0].getstart().get(gregoriancalendar.minute)) + " " + hours[0] .getlesson().getsummary(); } if(hours[1] != null){ nextlesson = hours[1].getstart().get(gregoriancalendar.hour_of_day) + ":" + utils.adjustminutes(hours[1].getstart().get(gregoriancalendar.minute)) + " " + hours[1] .getlesson().getsummary(); } views.settextviewtext(r.id.txt_widget_lesson1, currentlesson); views.settextviewtext(r.id.txt_widget_lesson2, nextlesson); appwidgetmanager.updateappwidget(new componentname(context, widget.class), views); } } } /** * method called when screen of widget should change. * action tells method screen should change. * @param context * @param action: screen method should switch to. either widget_screen1 or widget_screen2 */ public static void buildupdate(context context, string action){ remoteviews views; if(action.equals(switch_screen1)){ views = new remoteviews(context.getpackagename(), r.layout.widget_screen1); appwidgetmanager.getinstance(context).updateappwidget(new componentname(context, widget.class), views); layoutid = r.layout.widget_screen1; updatescreenfromdatabase(context, appwidgetmanager.getinstance(context), appwidgetmanager.getinstance(context).getappwidgetids(new componentname(context, widget.class))); } else if(action.equals(switch_screen2)){ views = new remoteviews(context.getpackagename(), r.layout.widget_screen2); appwidgetmanager.getinstance(context).updateappwidget(new componentname(context, widget.class), views); layoutid = r.layout.widget_screen2; } setlisteners(context); } /** * methods sets onclick listeners elements displayed on screen * @param context */ private static void setlisteners(context context){ appwidgetmanager manager = appwidgetmanager.getinstance(context); int[] appwidgetids = manager.getappwidgetids(new componentname(context, widget.class)); (int = 0 ; < appwidgetids.length; i++){ if(layoutid == r.layout.widget_screen1){ log.e("khlrooster", "setting listeners on widget screen 1"); remoteviews views = new remoteviews(context.getpackagename(), layoutid); intent intent = new intent(context, switchwidgetscreenservice.class); intent.setaction(switch_screen2); intent.setdata(uri.parse("uri::" + math.random())); log.e("khlrooster", "action of listener screen 1: " + intent.getaction()); pendingintent pi = pendingintent.getservice(context, 0, intent, intent.flag_activity_new_task); views.setonclickpendingintent(r.id.imgbtn_switchdown, pi); views.setonclickpendingintent(r.id.imgbtn_widget_notification, pi); manager.updateappwidget(new componentname(context, widget.class), views); log.e("khlrooster", "listeners set on widget screen 1"); } else if(layoutid == r.layout.widget_screen2){ log.e("khlrooster", "setting listeners on widget screen 2"); remoteviews views = new remoteviews(context.getpackagename(), layoutid); intent intent2 = new intent(context, switchwidgetscreenservice.class); intent2.setaction(switch_screen1); pendingintent pendingintent = pendingintent.getservice(context, 0, intent2, 0); views.setonclickpendingintent(r.id.imgbtn_switchup, pendingintent); intent2 = new intent(context, lessondetail.class); intent2.setaction(add_note); pendingintent = pendingintent.getactivity(context, 0, intent2, 0); views.setonclickpendingintent(r.id.imgbtn_notes, pendingintent); intent2= new intent(context, lessondetail.class); intent2.setaction(take_picture); pendingintent = pendingintent.getactivity(context, 0, intent2, 0); views.setonclickpendingintent(r.id.imgbtn_photo, pendingintent); manager.updateappwidget(new componentname(context, widget.class), views); log.e("khlrooster", "listeners set on widget screen 2"); } } } }
and here service responding intents:
public class switchwidgetscreenservice extends service { @override public ibinder onbind(intent arg0) { // todo auto-generated method stub return null; } @override public void oncreate() { super.oncreate(); log.e("khlrooster", "created switchwidgetscreenservice"); } @override public void onstart(intent intent, int startid) { //super.onstart(intent, startid); log.e("khlrooster", "started switchwidgetscreenservice"); handleevent(intent); } @override public int onstartcommand(intent intent, int flags, int startid) { handleevent(intent); log.e("khlrooster", "started switchwidgetscreenservice"); return super.onstartcommand(intent, flags, startid); } private void handleevent(intent intent) { log.e("khlrooster", "it works, screen changes to: " + intent.getaction()); if(intent.getaction().equals(widget.switch_screen1)){ widget.buildupdate(this, widget.switch_screen1); }else if(intent.getaction().equals(widget.switch_screen2)){ widget.buildupdate(this, widget.switch_screen2); } }
}
i solved problem, called setlisteners once more after getting data db.
Comments
Post a Comment