2011-02-01 2 views
6

На основе this учебника я создал виджет, который должен показывать время. Работа java работает, но сервис не работает.Обновление Android-виджета

HelloWidget.java:

public class HelloWidget extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

    Intent intent = new Intent(context, UpdateService.class); 
    context.startService(intent); 
} 

UpdateService.java:

public final class UpdateService extends Service { 
@Override 
public void onStart(Intent intent, int startId) { 
    RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.main); 

    Date date = new Date(); 
    java.text.DateFormat format = SimpleDateFormat.getTimeInstance(
      SimpleDateFormat.MEDIUM, Locale.getDefault()); 
      updateViews.setTextViewText(R.id.widget_textview, "Current Time " + format.format(date)); 

    ComponentName thisWidget = new ComponentName(this, HelloWidget.class); 
    AppWidgetManager manager = AppWidgetManager.getInstance(this); 
    manager.updateAppWidget(thisWidget, updateViews); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

hello_widget_provider.xml имеет эту строку: Android: updatePeriodMillis = "1000"

Проблема: виджет показывает текущее время, но он не обновляется (java-way is).

Моя основная цель - обновить виджет, например. 18:56 каждый день. ИДК, если это хороший способ, но я попытался изменить метод OnUpdate, как показано ниже, но у него есть проблемы с ALARM_SERVICE: ALARM_SERVICE не может быть решена с переменной

public class HelloWidget extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

    AlarmManager alarmManager; 
    Intent intent = new Intent(context, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
     intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, 18); 
    cal.set(Calendar.MINUTE, 56); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 86400, pendingIntent); 

} }

Любой помощь приветствуется.

ответ

15

Оглядываясь назад, когда я задавал этот вопрос, я понимаю, насколько я узнал за последние 1,5 года.

Поскольку я только что работал с виджетами за последние две недели, и я только что нашел этот неотвеченный вопрос, я решил его решить. Надеюсь, это поможет другим.

AppWidgetProvider должен выглядеть следующим образом:

public class MyWidget extends AppWidgetProvider { 

    public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget"; 
    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 
    private PendingIntent service = null; 

     @Override 
     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 


      final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

      final Calendar TIME = Calendar.getInstance(); 
      TIME.set(Calendar.MINUTE, 0); 
      TIME.set(Calendar.SECOND, 0); 
      TIME.set(Calendar.MILLISECOND, 0); 

      final Intent i = new Intent(context, MyService.class); 

      if (service == null) 
      { 
       service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
      } 

      m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), 1000 * 1, service); 

    } 

     @Override 
     public void onDeleted(Context context, int[] appWidgetIds) { 
       super.onDeleted(context, appWidgetIds); 
     } 

     @Override 
     public void onDisabled(Context context) { 
       super.onDisabled(context); 

       final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
       if (service != null) 
       { 
        m.cancel(service); 
       } 
     } 

     @Override 
     public void onEnabled(Context context) { 
       super.onEnabled(context); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 

     super.onReceive(context, intent); 

     } 

} 

Служба:

public class MyService extends Service 
{ 
    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     buildUpdate(); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    private void buildUpdate() 
    { 
     String lastUpdated = DateFormat.format("hh:mm:ss", new Date()).toString(); 

     RemoteViews view = new RemoteViews(getPackageName(), R.layout.widget_layout); 
     view.setTextViewText(R.id.btn_widget, lastUpdated); 

     ComponentName thisWidget = new ComponentName(this, MyWidget.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(this); 
     manager.updateAppWidget(thisWidget, view); 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 
} 

Кроме того, зарегистрировать поставщика и службы в манифесте:

<receiver android:name="MyWidget" android:label="Tutorial_Widget 1x1"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
       <action android:name="com.something.MyWidget.ACTION_WIDGET_RECEIVER"/> 
      </intent-filter>  
      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"/> 
     </receiver> 

     <service android:enabled="true" android:name=".MyService" /> 
+0

Прошу прощения, но где вы установили время, которое должно определить повторяющийся интервал? –

+1

'm.setRepeating (AlarmManager.RTC, TIME.getTime(). GetTime(), 1000 * 1, service);' – erdomester

+0

да, спасибо, я пришел с этим. Мне также интересно, как я могу установить определенное время, при котором будет осуществляться обновление. –

3

ALARM_SERVICE - это статическое поле класса Context. Поэтому введите Context.ALARM_SERVICE или используйте статический импорт.

Помните, что если вы установите значение атрибута updatePeriodMillis, это не гарантирует, что ваш метод onUpdate будет вызываться с этим периодом точно.

+0

Я никогда не имел этого проблема до сих пор. Когда я набираю, как вы сказали, возникает проблема с getSystemService: «Метод getSystemService (String) не определен для типа HelloWidget« – erdomester

+2

getSystemService (String) - это метод класса Context. Но провайдеры виджетов не являются контекстами. Они являются широковещательными приемниками и извлекают контекст в качестве параметра в своих методах. Поэтому вы должны ввести context.getSystemService (Context.ALARM_SERVICE) в код HelloWidget. –

Смежные вопросы