2017-02-09 5 views
3

Я разрабатываю виджет для своего приложения. Имя виджета - это история, когда пользователь просматривает какой-либо URL-адрес, я буду хранить его в локальном db, из которого отображается виджет.OnUpdate() не вызывает службу виджета

Когда я открываю виджет, он извлекает все данные из локального db и показывает его в виде списка виджетов.

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

Второй класс:

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

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

Третий класс: который собирается принести и обновить ListView.

выборка, выполняемая в 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 в браузере. Я использовал приведенную ниже кодовую синхронизацию, когда база данных обновляется новым 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.

Почему метод обслуживания не называется?

или любой другой способ обновить список ракурс, когда значения в базе данных изменений

+0

Может кто-нибудь пожалуйста, дайте мне несколько предложений.я действительно застрял с прошлой недели ... не в состоянии решить это. – Vji

ответ

2

Ответ мой сам:

Мы должны называть 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); 
     }