android调服务不更新,android – OnUpdate()不调用小部件服务

在开发Android应用小部件时遇到一个问题,当数据库更新时,小部件的onUpdate()方法不再被调用,导致服务无法更新列表视图。已尝试通过手动调用WidgetProvider的onUpdate()方法来触发更新,但未成功。问题在于如何在数据库变化时正确刷新小部件的列表视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在为我的应用程序开发一个小部件.窗口小部件名称是历史记录,当用户浏览任何URL时,我将其存储在本地数据库中,从中列出该窗口小部件.

当我打开小部件时,它从本地数据库中获取所有细节并在小部件的列表视图中显示它.

1)当我打开小部件时,首先调用WidgetProvider的onUpdate方法

2)然后onUpdate()将调用服务WidgetService

3)然后服务将调用Widget Factory使用本地存储的db更新列表视图.

在小部件工厂中,它将获取db值并更新小部件中的lisviews.

以上是设置窗口小部件时发生的过程.

第一堂课:

public class WidgetProviderFavorite extends AppWidgetProvider {

@SuppressWarnings("deprecation")

@Override

public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager,int[] appWidgetIds) {

for (int i=0; i

Intent svcIntent=new Intent(ctxt, WidgetServiceFavorite.class);

svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);

svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));

RemoteViews widget=new RemoteViews(ctxt.getPackageName(),R.layout.widget_favorite);

widget.setRemoteAdapter(appWidgetIds[i], R.id.listFavoriteLogin,svcIntent);

Intent clickIntent=new Intent(ctxt, WidgetActivityFavorite.class);

PendingIntent clickPI=PendingIntent.getActivity(ctxt, 0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);

widget.setPendingIntentTemplate(R.id.listFavoriteLogin, clickPI);

appWidgetManager.updateAppWidget(appWidgetIds[i], widget);

}

super.onUpdate(ctxt, appWidgetManager, appWidgetIds);

}

第二课:

public class WidgetServiceFavorite extends RemoteViewsService {

@Override

public RemoteViewsFactory onGetViewFactory(Intent intent) {

return(new WidgetFactoryFavorite(this.getApplicationContext(),intent));

}

}

第三类:将获取并更新列表视图.

在construtor中获取并getViewAt()(它自动调用)将设置值.

public class WidgetFactoryFavorite extends Activity implements RemoteViewsService.RemoteViewsFactory {

public WidgetFactoryFavorite(Context ctxt, Intent intent) {

int array_Index=0;

int array_Length=0;

WidgetDatabase db1=new WidgetDatabase(ctxt);

List facorite = db1.getFavorite();

array_Length=facorite.size();

mNames=new String[array_Length];

mSummary=new String[array_Length];

for (WidgetDatabaseModel cn : facorite) {

mNames[array_Index] =cn.getNAME();

mSummary[array_Index]= cn.getSUMMARY();

array_Index++;

}

this.mCtxt=ctxt;

intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,

AppWidgetManager.INVALID_APPWIDGET_ID);

}

@Override

public void onCreate() {

// no-op

}

@Override

public void onDestroy() {

// no-op

}

@Override

public int getCount() {

return(mNames.length);

}

@Override

public RemoteViews getViewAt(int position) {

RemoteViews row=new RemoteViews(mCtxt.getPackageName(),

R.layout.widget_rowfavorite);

row.setTextViewText(android.R.id.text1, mNames[position]);

Intent i=new Intent();

Bundle extras=new Bundle();

extras.putString(WidgetProviderFavorite.sExtra_Guid, mGuid[position]);

extras.putString(WidgetProviderFavorite.sExtra_Url, mUrl[position]);

i.putExtras(extras);

row.setOnClickFillInIntent(android.R.id.text1, i);

return(row);

}

@Override

public RemoteViews getLoadingView() {

return(null);

}

@Override

public int getViewTypeCount() {

return(1);

}

@Override

public long getItemId(int position) {

return(position);

}

@Override

public boolean hasStableIds() {

return(true);

}

@Override

public void onDataSetChanged() {

}

}

我的问题是:

当我在浏览器中浏览某些URL时,它不能并排同步.我在新数据库更新数据库时使用了以下代码同步.

int[] ids = AppWidgetManager.getInstance(mActivity).getAppWidgetIds(new ComponentName(mActivity, WidgetProviderFavorite.class));

WidgetProviderFavorite myWidget = new WidgetProviderFavorite();

myWidget.onUpdate(mActivity, AppWidgetManager.getInstance(mActivity),ids);

它调用onUpdate方法().但onUpdate不会调用将调用工厂类并使用新数据库值提升lisview的服务类.当我将新值添加到db时,我之前提到的流程没有发生.

为什么不调用服务方法?

或者任何其他方法在数据库值更改时刷新列表视图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值