Android-Widget onReceive kann nicht rufen Sie die Service-Klasse?
Ich habe eine widgetProvider . Ich habe auch eine service-Klasse, die die Berechnung für das widget.
Widget läuft gut, wenn initialisiert. Ich erhalte eine Fehlermeldung, wenn ich versuche zu nennen, die Services aus der onReceive Methode ausgeführt, nachdem eine broadcast-Ereignis, das ich will reagieren auf (Zeit ändern).
Wie kann ich update das widget vom onReceive nach Erhalt einer broadcast event?
Hier ist mein widget
public class HijriWidget extends AppWidgetProvider{
...
@Override
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_TIME_CHANGED.equals(intent.getAction())||Intent.ACTION_DATE_CHANGED.equals(intent.getAction())){
//THE CODE BELOW LEADS TO AN EXCEPTION. HOW CAN I UPDATE THE WIDGET HERE?
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
appWidgetManager.updateAppWidget(appWidgetId, remoteView);
}
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
PendingIntent updatepending = HijriWidget.makeControlPendingIntent(context,RefreshService.UPDATE, appWidgetId);
pi = updatepending;
try {
updatepending.send();
} catch (CanceledException e) {
e.printStackTrace();
}
setAlarm(context, appWidgetId, 5*60*1000);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
public static PendingIntent makeControlPendingIntent(Context context, String command, int appWidgetId) {
Intent active = new Intent(context,RefreshService.class);
active.setAction(command);
active.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
//this Uri data is to make the PendingIntent unique, so it wont be updated by FLAG_UPDATE_CURRENT
//so if there are multiple widget instances they wont override each other
Uri data = Uri.withAppendedPath(Uri.parse("hijriwidget://widget/id/#"+command+appWidgetId), String.valueOf(appWidgetId));
active.setData(data);
return(PendingIntent.getService(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT));
}
public static void setAlarm(Context context, int appWidgetId, int updateRate) {
PendingIntent newPending = makeControlPendingIntent(context,RefreshService.UPDATE,appWidgetId);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (updateRate >= 0) {
alarms.set( AlarmManager.RTC, calendar.getTimeInMillis(), newPending);
//alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), updateRate, newPending);
} else {
//on a negative updateRate stop the refreshing
alarms.cancel(newPending);
}
}
}
und hier ist mein service
public class RefreshService extends Service {
@Override
public void onStart(Intent intent, int startId) {
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
RemoteViews remoteView = new RemoteViews(getApplicationContext() .getPackageName(), R.layout.widget);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
mMonth++;
HijriCalendar hc =new HijriCalendar( mYear,mMonth,mDay);
remoteView.setTextViewText(R.id.TextView02,hc.getHijriMonth()+"/"+hc.getHijriDay());
remoteView.setTextColor(R.id.TextView02, Color.BLACK);
remoteView.setTextViewText(R.id.TextView01, hc.getHijriYear()+"");
remoteView.setTextColor(R.id.TextView01, Color.WHITE);
appWidgetManager.updateAppWidget(appWidgetId, remoteView);
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
//TODO Auto-generated method stub
return null;
}
Jede Hilfe wird geschätzt. Danke.
UPDATE:
Ich habe das problem gefunden. Überprüfen Sie meine Antwort unten.
- Welche exception bekommst du?
- java.lang.RuntimeException: Unable to start Empfänger com.majjoodi.hijri.HijriWidget ... Verursacht durch: java.lang.NullPointerException in com.majjoodi.hijri.HijriWidget.onRecieve
- Habe alle updates?
- robertokl, check mein update in der post.
InformationsquelleAutor Majjoodi | 2010-07-27
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, du hast erkannt, aber das problem in deinem original-code war, dass die ACTION_TIME_CHANGED Absicht nicht eine AppWidgetManager.EXTRA_APPWIDGET_ID extra, so getInt() war das werfen einer nullpointerexception.
Hinweis: es gibt einen etwas einfacheren Weg, um dieses problem zu lösen: eine der außer Kraft updateAppWidget dauert componentname statt der widget-id, so können Sie eine gemeinsame Funktion zum aktualisieren der widgets und nennen es von beiden onReceive und onUpdate, z.B.:
Dann müssen Sie nie sorgen über die widget-ids. Natürlich funktioniert dies nur, wenn Sie kümmern sich nicht um die Unterstützung mehrerer gleichzeitiger widgets.
Finden Sie unter: http://developer.android.com/reference/android/appwidget/AppWidgetManager.html#updateAppWidget%28android.content.ComponentName,%20android.widget.RemoteViews%29
UPDATE:
Habe ich den code unten in der onReceive-Methode, und es funktionierte für mich