在Android小部件中的onReceive之前调用OnUpdate
我想制作一个小部件,它有两个to按钮来更改小部件中的文本和图像。我的问题是,在OnReceive之前,我无法将所需的位置从服务发送到AppWidgetProvider类调用onUpdate,因此我无法获取发送到AppWidgetProvider的额外内容。。这是我的密码。。。我想在更新之前给onReceive打电话在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
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
。因此,在此之前,您应该执行任何需要的操作