![](/img/trans.png)
[英]Android-Widget : Calling BroadcastReceiver onReceive from onUpdate of Appwidgetprovider
[英]OnUpdate() not calling the widget service
我正在為我的應用程序開發一個小部件。 窗口小部件名稱是歷史記錄,當用戶瀏覽任何URL時,我將其存儲在本地數據庫中,從中列出該窗口小部件。
當我打開小部件時,它從本地數據庫中獲取所有細節並在小部件的列表視圖中顯示它。
1)當我打開小部件時,首先調用WidgetProvider的 onUpdate方法
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));
}
}
第三類:將獲取並更新列表視圖。
在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時,它不能並排同步 。 我在新數據庫更新數據庫時使用了以下代碼同步。
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時,我之前提到的流程沒有發生。
為什么不調用服務方法?
或者任何其他方法在數據庫值更改時刷新列表視圖
回答我的自我:
我們必須在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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.