be a example
step 1: register the provide with one more action
<receiver
android:name=".widget.DetailWidgetProvider"
android:label="@string/title_widget_detail"
android:enabled="@bool/widget_detail_enabled" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.example.android.sunshine.app.ACTION_DATA_UPDATED" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_info_detail" />
</receiver>
step2 in DetailWidgetProvider overview onReceive
@Override
public void onReceive(@NonNull Context context, @NonNull Intent intent) {
super.onReceive(context, intent);
if (SunshineSyncAdapter.ACTION_DATA_UPDATED.equals(intent.getAction())) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
new ComponentName(context, getClass()));
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
}
}
the above code will call the RemoteViewsFactory 's onDataSetChanged method.
step 3 override the onDataSetChanged in RemoteViewsFactory class
if (data != null) {
data.close();
}
// This method is called by the app hosting the widget (e.g., the launcher)
// However, our ContentProvider is not exported so it doesn't have access to the
// data. Therefore we need to clear (and finally restore) the calling identity so
// that calls use our process and permission
final long identityToken = Binder.clearCallingIdentity();
String location = Utility.getPreferredLocation(DetailWidgetRemoteViewsService.this);
Uri weatherForLocationUri = WeatherContract.WeatherEntry
.buildWeatherLocationWithStartDate(location, System.currentTimeMillis());
data = getContentResolver().query(weatherForLocationUri,
FORECAST_COLUMNS,
null,
null,
WeatherContract.WeatherEntry.COLUMN_DATE + " ASC");
Binder.restoreCallingIdentity(identityToken);
explain
data = getContentResolver().query(weatherForLocationUri,
FORECAST_COLUMNS,
null,
null,
WeatherContract.WeatherEntry.COLUMN_DATE + " ASC");
use to get the data again.