OnUpdate()不调用窗口小部件服务

Vji*_*Vji 5 android listview android-widget android-syncadapter

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

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

1)当我打开小部件,第一的onUpdate方法WidgetProvider被称为

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<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);
          } 
Run Code Online (Sandbox Code Playgroud)

第二课:

        public class WidgetServiceFavorite extends RemoteViewsService {
          @Override
          public RemoteViewsFactory onGetViewFactory(Intent intent) {

            return(new WidgetFactoryFavorite(this.getApplicationContext(),intent));         
          }
        }
Run Code Online (Sandbox Code Playgroud)

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

在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<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() {
          }
        }
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

        int[] ids = AppWidgetManager.getInstance(mActivity).getAppWidgetIds(new ComponentName(mActivity, WidgetProviderFavorite.class));
        WidgetProviderFavorite myWidget = new WidgetProviderFavorite();
        myWidget.onUpdate(mActivity, AppWidgetManager.getInstance(mActivity),ids);
Run Code Online (Sandbox Code Playgroud)

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

为什么不调用服务方法?

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

Vji*_*Vji 6

回答我自己:

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

   appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listView);
Run Code Online (Sandbox Code Playgroud)

完成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);
      } 
Run Code Online (Sandbox Code Playgroud)

  • 在我这边, onUpdate 正在调用,但 listview 上的服务是服务部分,尽管我调用了 notificationAppWidgetViewDataChanged ,但服务部分并未调用 (3认同)