2013-05-11 24 views
6

我想要做一个列表控件里面,我要实现的是RemoteViewsService的扩展一个类,但这个类从来没有执行,我的代码如下:RemoteViewsService不执行,

MyWidgetProvider

public class MyWidgetProvider extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
        int[] appWidgetIds) { 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); 

    Intent updateIntent = new Intent(context, WidgetService.class); 
    for (int appWidgetId : appWidgetIds) { 
     updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME))); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
      views.setRemoteAdapter(appWidgetId, updateIntent); 
     else 
      views.setRemoteAdapter(appWidgetId, R.id.events_list, updateIntent); 

     appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.events_list);   
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 
} 

WidgetService

public class WidgetService extends RemoteViewsService { 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return new WidgetFactory(getApplicationContext(), intent); 
    } 
} 

而且清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.widget.example" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" >  

    <receiver android:name=".MyWidgetProvider" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/appwidget_info" /> 
    </receiver> 

    <service android:name=".WidgetService" 
     android:permission="android.permission.BIND_REMOTEVIEWS" 
     android:exported="false"> 
    </service> 

</application> 

编辑; 我已经发现了错误,我必须使用:的

views.setRemoteAdapter(R.id.events_list, updateIntent); 

代替

views.setRemoteAdapter(appWidgetId, updateIntent); 

回答

1

RemoteViews.html#setRemoteAdapter

三个参数SetRemoteAdapter函数已不再API等级14+,甚至如果你调用了3个参数之一,那么widget id参数将被忽略。所以该函数总是只接收2个有效参数,即view_id和intent。

这个函数基本上说我将使用意图作为视图的数据源(由view_id表示)。

0

对于我这种工作

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
    for (int widgetId : appWidgetIds) { 
     RemoteViews mView = initViews(context, appWidgetManager, widgetId); 
     appWidgetManager.updateAppWidget(widgetId, mView); 
    } 

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



@SuppressWarnings("deprecation") 
@SuppressLint("NewApi") 
private RemoteViews initViews(Context context, 
           AppWidgetManager widgetManager, int widgetId) { 

    RemoteViews mView = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 

    Intent intent = new Intent(context, WidgetService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 

    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
    mView.setRemoteAdapter(widgetId, R.id.widgetCollectionList, intent); 

    return mView; 
}