2012-10-09 51 views
2

我的Android 4.1.1中的AppWidget有一個非常奇怪的問題。我目前正在開發音樂播放器應用程序及其小部件。 Widget必須在歌曲改變時更新,播放器開始和停止。它有一個ListView,它必須與應用程序中的播放列表同步。Android爲AppWidget設置了不同的佈局

之前果凍豆一切工作正常。在我的測試設備從4.0.3升級到4.1.1之後,無論何時通過程序強制更新小部件,Android的消息部件佈局都會設置爲我的小部件幾秒鐘!我也在4.1中用模擬器檢查過這種情況,它工作正常。

我使用這段代碼,迫使我的小工具來更新:

AppWidgetManager man = AppWidgetManager.getInstance(applicationContext); 
int[] ids = man.getAppWidgetIds(
     new ComponentName(applicationContext, MuzikLargeWidgetProvider.class)); 
Intent updateIntent = new Intent(); 
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
applicationContext.sendBroadcast(updateIntent); 

這裏是我的onUpdate方法

public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    this.context = context; 
    this.appWidgetManager = appWidgetManager; 

    ComponentName thisWidget = new ComponentName(context, 
      MuzikLargeWidgetProvider.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

    for (int appWidgetId : allWidgetIds) { 
     Intent svcIntent = new Intent(context, UpdateService.class); 
     svcIntent.putExtra(WidgetActions.DATA_WIDGET_ID, appWidgetId); 
     context.startService(svcIntent); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

我使用的服務(UpdateService),這是一種靜態內部類,以更新我的部件:

public static class UpdateService extends IntentService { 

    public UpdateService() { 
     super("UpdateService"); 
    } 

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


    public RemoteViews buildUpdate(Context context, int widgetId) { 

     final RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.muzikwidget_large); 

     return views; 
    } 


    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Build the widget update 
     RemoteViews updateViews = buildUpdate(this, intent.getIntExtra(WidgetActions.DATA_WIDGET_ID, 0)); 

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

buildUpdate方法可以做更多的事情(設置intent for小部件的按鈕,設置文字瀏覽等),但它們與我的問題沒有關係。我在華碩TF 300 TG平板電腦上遇到這個問題(沒有根)。

任何幫助表示讚賞。

回答

2

問題已解決。我修改了我用來強制小部件更新的代碼片斷。這是工作:

AppWidgetManager man = AppWidgetManager.getInstance(applicationContext); 
int[] ids = man.getAppWidgetIds(
     new ComponentName(applicationContext, MuzikLargeWidgetProvider.class)); 

for (int appWidgetId : ids) { 
    Intent svcIntent = new Intent(applicationContext, UpdateService.class); 
    svcIntent.putExtra(WidgetActions.DATA_WIDGET_ID, appWidgetId); 
    applicationContext.startService(svcIntent); 
} 

Widget的onUpdate方法不被調用,並直接調用UpdateService。有時候應該避免sendBroadcast。

編輯

如果您需要使用廣播來更新你的widget,這似乎是實現這一有道:

AppWidgetManager man = AppWidgetManager.getInstance(applicationContext); 
int[] ids = man.getAppWidgetIds(
     new ComponentName(applicationContext, MuzikLargeWidgetProvider.class)); 
Intent updateIntent = new Intent(applicationContext, MuzikLargeWidgetProvider.class); 
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
applicationContext.sendBroadcast(updateIntent); 
+0

謝謝,你幫了我很多。我在4.1.1上遇到了小部件更新的問題,並且您創建小部件更新的意圖的方式非常棒! –

+0

我很高興能幫上忙 – serdar