2011-02-01 57 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具有此行:機器人:updatePeriodMillis = 「1000」

問題:小部件顯示當前時間,但它不更新(java方式)。

我的主要目標是更新例如每天18:56。 IDK如果這是很好的方式,但我試圖修改的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" /> 
3

ALARM_SERVICE是Context類的靜態字段。因此輸入Context.ALARM_SERVICE或使用靜態導入。

請記住,當您設置updatePeriodMillis屬性值時,不能保證您的onUpdate方法完全以該期間進行調用。

+0

我從未有過這種問題到目前爲止。當我按照你所說的鍵入時,getSystemService有一個問題:「getSystemService(String)方法未定義爲類型HelloWidget」 – erdomester 2011-02-03 23:11:08

+2

getSystemService(String)是Context類的一個方法。但小工具提供者不是上下文。它們是廣播接收器,並在他們的方法中檢索上下文作爲參數。所以你應該在HelloWidget代碼中輸入context.getSystemService(Context.ALARM_SERVICE)。 – 2011-02-06 14:24:23