OnUpdate()不调用小部件服务

问题描述:

我正在为我的应用程序开发小部件。窗口小部件名称是历史记录,当用户浏览任何URL时,我将它存储在本地数据库中,该窗口小部件列表来自它。OnUpdate()不调用小部件服务

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

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

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

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

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

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

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

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

第三类:这是会获取和更新列表视图

第一类:

 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); 
      } 

第二类。

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

我的问题是:

它不是并排当我浏览了一些网址在浏览器中通过同步侧。当数据库被新的URL更新时,我使用了下面的代码同步。其调用onUpdate方法()。但onUpdate不会调用要调用工厂类的服务类,并用新的数据库值调用lisview。我之前提到的流程在新值添加到db时没有发生。

为什么不调用服务方法?

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

+0

任何人都可以请给我一些建议。我从上周开始就陷入了困境......无法解决这个问题。 – Vji

回答我的自我:

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

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); 
     }