gpt4 book ai didi

android - OnUpdate() 不调用小部件服务

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:51:54 24 4
gpt4 key购买 nike

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

当我打开小部件时,它会从本地数据库中获取所有详细信息并将其显示在小部件的 ListView 中。

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

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

3) 然后服务将调用Widget Factory 使用本地存储的数据库更新 ListView 。

在 widget factory 中,它将获取 db 值并更新 widget 中的 lisviews。

以上是设置小部件时发生的过程。

第一类:

        public class WidgetProviderFavorite extends AppWidgetProvider {

@SuppressWarnings("deprecation")
@Override
public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
for (int i=0; i<appWidgetIds.length; 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));
}
}

第三类:获取和更新 ListView 。

在构造函数和 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<WidgetDatabaseModel> 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 时,它没有并排同步。当数据库通过新 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 的服务类。当新值添加到数据库时,我之前提到的流程没有发生。

为什么不调用服务方法?

或任何其他方法在数据库值更改时刷新 ListView

最佳答案

回答我自己:

我们必须在 onUpdateMethod() 中调用 notifyAppWidgetViewDataChanged()。

   appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listView);

完成 OnUpdate():

    public class WidgetProviderFavorite extends AppWidgetProvider {

@SuppressWarnings("deprecation")
@Override
public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
for (int i=0; i<appWidgetIds.length; 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.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listView);

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

}

super.onUpdate(ctxt, appWidgetManager, appWidgetIds);
}

关于android - OnUpdate() 不调用小部件服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42129390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com