OnUpdate() 未调用小部件服务

Posted

技术标签:

【中文标题】OnUpdate() 未调用小部件服务【英文标题】:OnUpdate() not calling the widget service 【发布时间】:2017-06-27 00:44:57 【问题描述】:

我正在为我的应用程序开发一个小部件。小部件名称是历史记录,当用户浏览任何 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));         
          
        

第三类:它将获取和更新列表视图。

在构造函数和 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 的服务类。当向 db 添加新值时,我之前提到的流程不会发生。

为什么不调用服务方法?

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

【问题讨论】:

谁能给我一些建议。从上周开始,我真的被困住了......无法解决这个问题。 【参考方案1】:

回答我自己:

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

【讨论】:

在我这边 onUpdate 调用,但 listview 上的服务是服务部分没有调用,虽然我调用 notifyAppWidgetViewDataChanged 你拯救了我的一天!

以上是关于OnUpdate() 未调用小部件服务的主要内容,如果未能解决你的问题,请参考以下文章

小部件onUpdate调用一次

从应用程序的主要活动中调用小部件的 onUpdate 方法

在小部件中单击按钮后服务未启动

如何使用服务来监控 Android 中的方向变化

onUpdate 未在小部件中调用,即使我在 onreceive 中看到 android.appwidget.action.APPWIDGET_UPDATE 意图

WidgetProvider 在没有显示小部件时接收广播