问题描述
我决定在本周末创建我的第一个Android小部件,尽管我已经使它能够工作一些,但直到旋转设备(使用Launcher Pro Plus才可以显示风景和旋转主屏幕),它才显示动态加载的内容。
小部件非常简单,它只是从网站检索图像并显示图像。 我创建了一个在AppWidgetProvider子类的onUpdate()中启动的服务。 然后,该服务检索图像,构建RemoteViews对象,然后在AppWidgetManager上调用updateAppWidget()。 这是小部件的代码:
public class PropagationWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
context.startService(new Intent(context, UpdateService.class));
}
public static class UpdateService extends IntentService {
public UpdateService() {
super("PropagationWidget$UpdateService");
}
@Override
protected void onHandleIntent(Intent intent) {
ComponentName me=new ComponentName(this,
PropagationWidget.class);
AppWidgetManager mgr=AppWidgetManager.getInstance(this);
mgr.updateAppWidget(me, buildUpdate(this));
}
public RemoteViews buildUpdate(Context context) {
RemoteViews views = null;
URL imageUrl = null;
try {
views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
imageUrl = new URL(
"http://www.mountainlake.k12.mn.us/ham/aprs/path.cgi?map=na&img=node&freq=144&type=image");
InputStream is = (InputStream) imageUrl.getContent();
Bitmap image = BitmapFactory.decodeStream(is);
views.setImageViewBitmap(R.id.image, image);
Time today = new Time();
today.setToNow();
views.setTextViewText(R.id.last_updated, "Last updated: " + today.format("%D %r"));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return views;
}
}
加载小部件时,我只获得小部件的框架,但没有内容,这是有道理的,因为UpdateService仍未从网站检索图像。 但是,即使UpdateService已完成检索图像并立即调用updateAppWidget(),该图像仍然不会出现。 但是,当我旋转设备时,图像会出现,并且在后续旋转时会保留下来。
同样,在appwidget-provider XML中将小部件设置为每30分钟更新一次。 在我旋转设备之前,这些更新不会显示,并且在重新绘制小部件时,我会看到更新。
我真的缺少一些基本的东西吗? 任何见解将不胜感激! 请让我知道是否需要提供其他信息来帮助您。
1楼
我正在做类似的事情,我的UpdateService像这样更新小部件:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());int [] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(getApplicationContext(),WidgetProvider.class));
for (int i=0; i<appWidgetIds.length; i++)
{
RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(),
R.layout.widget_layout);
//Set Image Resource/Bitmap from Web here like: remoteViews.setImageViewBitmap(viewId, bitmap);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
但是请记住,小部件的频繁更新可能会很快耗尽电池电量。