当前位置: 代码迷 >> Android >> Android:小部件在创建时不会加载内容
  详细解决方案

Android:小部件在创建时不会加载内容

热度:58   发布时间:2023-08-04 11:40:36.0

我决定在本周末创建我的第一个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分钟更新一次。 在我旋转设备之前,这些更新不会显示,并且在重新绘制小部件时,我会看到更新。

我真的缺少一些基本的东西吗? 任何见解将不胜感激! 请让我知道是否需要提供其他信息来帮助您。

我正在做类似的事情,我的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);
        }

但是请记住,小部件的频繁更新可能会很快耗尽电池电量。

  相关解决方案