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

时间:2017-02-09 06:07:26

标签: android listview android-widget android-syncadapter

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

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

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

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

3)然后服务将调用 Widget Factory 以使用本地存储的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);
          } 

第二节课:

        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<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() {
          }
        }

我的问题是:

当我在浏览器中浏览某个网址时,它并没有并排同步。我在新网址更新数据库时使用了以下代码同步。

        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。

时,我之前提到的流程没有发生

为什么不调用服务方法?

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

1 个答案:

答案 0 :(得分:3)

回答我的自我:

我们必须在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);
      }