在Android小部件中的onReceive之前调用OnUpdate

在Android小部件中的onReceive之前调用OnUpdate,android,android-widget,broadcastreceiver,appwidgetprovider,Android,Android Widget,Broadcastreceiver,Appwidgetprovider,我想制作一个小部件,它有两个to按钮来更改小部件中的文本和图像。我的问题是,在OnReceive之前,我无法将所需的位置从服务发送到AppWidgetProvider类调用onUpdate,因此我无法获取发送到AppWidgetProvider的额外内容。。这是我的密码。。。我想在更新之前给onReceive打电话 public class Youm7widget extends AppWidgetProvider { private int position = 0; @Override

我想制作一个小部件,它有两个to按钮来更改小部件中的文本和图像。我的问题是,在OnReceive之前,我无法将所需的位置从服务发送到AppWidgetProvider类调用onUpdate,因此我无法获取发送到AppWidgetProvider的额外内容。。这是我的密码。。。我想在更新之前给onReceive打电话

public class Youm7widget extends AppWidgetProvider {

private int position = 0;

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    super.onReceive(context, intent);
    Log.d("on recieve", "here");
    position = intent.getIntExtra("position", 0);
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    // TODO Auto-generated method stub

    Log.d("on update", "here");
    ComponentName thisWidget = new ComponentName(context, Youm7widget.class);

    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

    // Build the intent to call the service
    Intent intent = new Intent(context.getApplicationContext(),
            WidgetConfiguration.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
    intent.putExtra("position", position);

    // Update the widgets via the service
    context.startService(intent);

}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
    // TODO Auto-generated method stub
    super.onDeleted(context, appWidgetIds);
    Toast.makeText(context, "Widget Deleted", Toast.LENGTH_SHORT).show();
}
  }
这就是我用来更新和更改小部件上数据的服务

public class WidgetConfiguration extends Service {

private AppManager appManager;
private int[] allWidgetIds = null;
AppWidgetManager appWidgetManager;
private List<News> newsWidget;
private ImageLoader imageLoader = ImageLoader.getInstance();
private static DisplayImageOptions optionsWithFakeDisplayer;
private int position  ; 

static {
    optionsWithFakeDisplayer = new DisplayImageOptions.Builder().displayer(
            new FakeBitmapDisplayer()).build();
}



@Override
@Deprecated
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub



    appManager = AppManager.getInstance();
    appWidgetManager = AppWidgetManager.getInstance(this
            .getApplicationContext());

    position = intent.getIntExtra("position" , 4);
    Toast.makeText(getApplicationContext(), String.valueOf(position),
            Toast.LENGTH_LONG).show();

    // get ids
     if (allWidgetIds != null) {

     } else {
    allWidgetIds = intent
            .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
     }


    try {

        newsWidget = loadXml(
                "http://mobrss.youm7.com/rss/service.svc/SelectForSpecifiedSection/SecID/12/page/1",
                true, "0");

        for (final int widgetId : allWidgetIds) {
            final RemoteViews remoteViews = new RemoteViews(this
                    .getApplicationContext().getPackageName(),
                    R.layout.widget_layout);

            remoteViews.setViewVisibility(R.id.W_loading_bar, View.VISIBLE);
            remoteViews.setViewVisibility(R.id.Wrefresh_button, View.GONE);
            remoteViews.setTextViewText(R.id.Winner_title, newsWidget
                    .get(0).getTitle().toString());



            imageLoader.getInstance().loadImage(
                    newsWidget.get(position).getMainImageLink(), null,
                    optionsWithFakeDisplayer,
                    new SimpleImageLoadingListener() {
                        @Override
                        public void onLoadingComplete(String imageUri,
                                View view, Bitmap loadedImage) {
                            // TODO Auto-generated method stub
                            super.onLoadingComplete(imageUri, view,
                                    loadedImage);
                            remoteViews.setImageViewBitmap(
                                    R.id.Winner_image, loadedImage);
                            appWidgetManager.updateAppWidget(widgetId,
                                    remoteViews);

                        }
                    });

            // Register an onClickListener
            Intent clickIntent = new Intent(this.getApplicationContext(),
                    Youm7widget.class);

            clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
                    allWidgetIds);
            clickIntent.putExtra("position",  0);

            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    getApplicationContext(), 0, clickIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.Wrefresh_button,
                    pendingIntent);

            Intent in = new Intent(getApplicationContext(),
                    DetailsActivity.class);
            in.putExtra("ID", newsWidget.get(position).getID());

            PendingIntent pi = PendingIntent.getActivity(
                    getApplicationContext(), 0, in, 0);
            remoteViews.setOnClickPendingIntent(R.id.Winner_image, pi);



            // Build the intent to call the service
            Intent fw = new Intent(this.getApplicationContext(),
                    Youm7widget.class);

            fw.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            fw.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
                    allWidgetIds);
            fw.putExtra("position",  2);



            PendingIntent fwpi = PendingIntent.getBroadcast(
                    getApplicationContext(), 0, fw,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.Wprevitem,
                    fwpi);



            remoteViews.setViewVisibility(R.id.W_loading_bar, View.GONE);
            remoteViews.setViewVisibility(R.id.Wrefresh_button, View.VISIBLE);

            appWidgetManager.updateAppWidget(widgetId, remoteViews);

        }
    } catch (IOException e) {
        Log.d("IO exceptions", "ture");
        Toast.makeText(getApplicationContext(), "IO exceptions",
                Toast.LENGTH_LONG).show();
    } catch (XmlPullParserException xm) {
        Log.d("XML exceptions", "true");
        Toast.makeText(getApplicationContext(), "XML exceptions",
                Toast.LENGTH_LONG).show();
    }

    super.onStart(intent, startId);
}
公共类WidgetConfiguration扩展服务{
私人AppManager;
private int[]allWidgetIds=null;
AppWidgetManager AppWidgetManager;
私有列表新闻控件;
私有ImageLoader ImageLoader=ImageLoader.getInstance();
私人静态显示图像选项与假显示器;
私人职位;
静止的{
options WithFakeDisplayer=新建DisplayImageOptions.Builder().displayer(
新的FakeBitmapDisplayer()).build();
}
@凌驾
@不赞成
公共无效启动(Intent Intent,int startId){
//TODO自动生成的方法存根
appManager=appManager.getInstance();
appWidgetManager=appWidgetManager.getInstance(此
.getApplicationContext());
位置=意图。getIntExtra(“位置”,4);
Toast.makeText(getApplicationContext(),String.valueOf(position),
Toast.LENGTH_LONG).show();
//获取身份证
if(allWidgetIds!=null){
}否则{
allWidgetIds=intent
.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_id);
}
试一试{
newsWidget=loadXml(
"http://mobrss.youm7.com/rss/service.svc/SelectForSpecifiedSection/SecID/12/page/1",
正确,“0”);
for(最终整数widgetId:AllWidgetId){
最终远程视图远程视图=新远程视图(此
.getApplicationContext().getPackageName(),
R.layout.widget_布局);
remoteViews.setViewVisibility(R.id.W_加载条,View.VISIBLE);
remoteViews.setViewVisibility(R.id.Wrefresh\u按钮,View.GONE);
remoteViews.setTextViewText(R.id.Winner\u标题,newsWidget
.get(0.getTitle().toString());
imageLoader.getInstance().loadImage(
newsWidget.get(position.getMainImageLink(),null,
带假显示器的选项,
新的SimpleImageLoadingListener(){
@凌驾
public void onLoadingComplete(字符串imageUri,
视图,位图加载(图像){
//TODO自动生成的方法存根
super.onLoadingComplete(图像URI、视图、,
加载图像);
remoteViews.setImageViewBitmap(
R.id.Winner_图像,加载图像);
appWidgetManager.UpdateAppWidgetId(widgetId,
远程视图);
}
});
//注册onclick侦听器
Intent clickIntent=新的Intent(this.getApplicationContext(),
Youm7widget.class);
单击intent.setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,
所有widgetids);
单击intent.putExtra(“位置”,0);
PendingIntent PendingIntent=PendingIntent.getBroadcast(
getApplicationContext(),0,单击意图,
PendingEvent.FLAG_UPDATE_CURRENT);
RemoteView.SetOnClickPendingEvent(R.id.U按钮,
悬挂式);
Intent in=新的Intent(getApplicationContext(),
DetailsActivity.class);
在.putExtra(“ID”,newsWidget.get(position.getID());
PendingEvent pi=PendingEvent.getActivity(
getApplicationContext(),0,in,0);
RemoteView.SetOnClickPendingContent(R.id.Winner\u图像,pi);
//建立调用服务的意图
Intent fw=新的Intent(this.getApplicationContext(),
Youm7widget.class);
fw.setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
fw.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,
所有widgetids);
fw.putExtra(“位置”,2);
PendingEvent fwpi=PendingEvent.getBroadcast(
getApplicationContext(),0,fw,
PendingEvent.FLAG_UPDATE_CURRENT);
RemoteView.SetOnClickPendingContent(R.id.Wprevitem,
fwpi);
remoteViews.setViewVisibility(R.id.W_加载条,View.GONE);
RemoteView.setViewVisibility(R.id.Wrefresh\u按钮,View.VISIBLE);
updateAppWidgetManager.UpdateAppWidgetId(widgetId,RemoteView);
}
}捕获(IOE异常){
Log.d(“IO例外”、“真实”);
Toast.makeText(getApplicationContext(),“IO异常”,
Toast.LENGTH_LONG).show();
}catch(XmlPullParserException xm){
Log.d(“XML异常”、“true”);
Toast.makeText(getApplicationContext(),“XML异常”,
Toast.LENGTH_LONG).show();
}
super.onStart(intent,startId);
}

只需在自定义代码之后移动
super.onReceive()
,如下所示:

@Override
public void onReceive(Context context, Intent intent) {
    position = intent.getIntExtra("position", 0);
    super.onReceive(context, intent);
}

super.onReceive()
将您的意图操作分派给他的处理方法。对于更新操作,它将立即调用
onUpdate
。因此,在此之前您应该做任何需要做的事情。

只需在自定义代码之后移动
super.onReceive()
,如下所示:

@Override
public void onReceive(Context context, Intent intent) {
    position = intent.getIntExtra("position", 0);
    super.onReceive(context, intent);
}
super.onReceive()
将您的意图操作分派给他的处理方法。对于更新操作,它将立即调用
onUpdate
。因此,在此之前,您应该执行任何需要的操作