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