2011-02-24 119 views
3

當我在調試模式下運行時,我似乎無法觸及服務中的任何斷點,爲什麼?Android appwidget服務無法啓動

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    context.startService(new Intent(context, UpdateService.class)); 
} 

public static class UpdateService extends Service { 

    @Override 
    public void onStart(Intent intent, int startId) { 
     // Build the widget update for today 
     RemoteViews updateViews = buildUpdate(this); 

     // Push update for this widget to the home screen 
     ComponentName thisWidget = new ComponentName(this, WidgetProvider.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(this); 
     manager.updateAppWidget(thisWidget, updateViews); 
    } 

    public RemoteViews buildUpdate(Context context) { 
     return new RemoteViews(context.getPackageName(), R.id.widget_main_layout); 
    } 


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

回答

2

「onUpdate」方法僅在小部件初始化(例如放在主屏幕上)或updatePeriodMillis過期時才執行。如果您想執行該服務,例如通過點擊小部件,你必須「附加」這樣一個待定的意圖:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
final Intent intent = new Intent(context, UpdateService.class); 
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

// Get the layout for the App Widget and attach an on-click listener to 
// the button 
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout....); 
views.setOnClickPendingIntent(R.id.button, pendingIntent); 
for(int i=0,n=appWidgetIds.length;i<n;i++){ 
    int appWidgetId = appWidgetIds[i]; 
    appWidgetManager.updateAppWidget(appWidgetId , views); 
} 

(清理工作小工具的版本)。

問題是,onUpdate()方法確實很少執行。與小部件的真正交互是通過未決意圖指定的。

2

您的Service可能未在清單中註冊。或者您的AppWidgetProvider可能未在清單中註冊。

0

您可能想要考慮不使用服務來處理您正在做的事情。如果它每天只運行一次updateViews(),那麼可以考慮在鏈接到appwidget的XML文件中將android:updatePeriodMillis設置爲86400000。你的XML文件看起來是這樣的:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="72dp" 
    android:maxWidth="72dp" 
    android:updatePeriodMillis="86400000" > 
</appwidget-provider> 

這將對Android的更新您的appwidget一次,而無需在後臺服務運行可能由用戶正在運行的任務的殺手被打死一天後停止你的小部件從更新。請注意,如果您需要更新的速度超過每30分鐘一次,那麼android:updatePeriodMillis將無法工作(最小值爲30分鐘),因此我建議您使用AlarmManager,因爲這會消耗更少的電量一個服務,也不會被任務殺手殺死。