2017-02-09 7 views
3

私のアプリケーション用のウィジェットを開発中です。ウィジェット名は履歴です。ユーザーが任意のURLをブラウズすると、それをローカルデータベースに格納します。ローカルデータベースにウィジェットのリストが格納されます。OnUpdate()がウィジェットサービスを呼び出さない

ウィジェットを開くと、ローカルデータベースからすべての詳細がフェッチされ、ウィジェットのリストビューに表示されます。次いで

1)iは、ウィジェット、WidgetProviderの最初にonUpdate方法は

2と呼ばれるオープン)にonUpdate()は、サービスがを呼び出す)

3 WidgetServiceサービスを呼び出しますWidget Factoryローカルに保存されたデータベースを使用してリストビューを更新します。

ウィジェットファクトリでは、db値を取得し、ウィジェットのlisviewを更新します。

上記はウィジェットの設定時に発生するプロセスです。

ファーストクラス:

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

私の問題は、次のとおりです。私は私のブラウザにいくつかの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

を変更したときに、リストビューを更新:

我々は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); 
     } 
関連する問題