我创建了一个Contentprovide,并实现了这样的update()方法:
@Override public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs) { final sqliteDatabase db = mHelper.getWritableDatabase(); int count = db.update(InslideDB.FOLDER_TABLE,values,selection,selectionArgs); /* To notify the observer */ this.getContext().getContentResolver().notifyChange(URI,null); return count; }
如何在我的appwidget中获得通知?谢谢!
我正在尝试这个Resolver,但没有日志(——————–更改日期)打印:
class DataProviderObserver extends ContentObserver { private AppWidgetManager mAppWidgetManager; private ComponentName mComponentName; DataProviderObserver(AppWidgetManager mgr,ComponentName cn,Handler h) { super(h); mAppWidgetManager = mgr; mComponentName = cn; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); //NOTE: Have to call this. dwy. // The data has changed,so notify the widget that the collection view needs to be updated. // In response,the factory's onDataSetChanged() will be called which will requery the // cursor for the new data. Log.d("PresenterWidgetProvider","--------------------Date Changed"); mAppWidgetManager.notifyAppWidgetViewDataChanged( mAppWidgetManager.getAppWidgetIds(mComponentName),R.id.inslide_grid); } } public class PresenterWidgetProvider extends appwidgetprovider{ private static final String AUTHORITY = "com.apps.slide"; static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/folder"); public static final String EXTRA_INSLIDE_PATH = "EXTRA_WIDGET_PATH"; private static HandlerThread sWorkerThread; private static Handler sWorkerQueue; private static DataProviderObserver sDataObserver; public PresenterWidgetProvider () { // Start the worker thread to update Content Provider. sWorkerThread = new HandlerThread("PresenterWidgetProvider worker"); sWorkerThread.start(); sWorkerQueue = new Handler(sWorkerThread.getLooper()); } @Override public void onEnabled(Context context) { // Register for external updates to the data to trigger an update of the widget. When using // content providers,the data is often updated via a background service,or in response to // user interaction in the main app. To ensure that the widget always reflects the current // state of the data,we must listen for changes and update ourselves accordingly. final ContentResolver r = context.getContentResolver(); if (sDataObserver == null) { final AppWidgetManager mgr = AppWidgetManager.getInstance(context); final ComponentName cn = new ComponentName(context,PresenterWidgetProvider.class); sDataObserver = new DataProviderObserver(mgr,cn,sWorkerQueue); r.registerContentObserver(CONTENT_URI,true,sDataObserver); Log.d("PresenterWidgetProvider","--------------------onEnabled. sDataObserver = " + sDataObserver); } }
所以,我终于通过4个步骤解决了:
>添加
this.getContext().getContentResolver().notifyChange(URI,null);
到ContentProvider的updat()insert()delete()回调.
>创建一个新的观察者和新的线程来处理它.
>在Observer的onChange()中调用notifyAppWidgetViewDataChanged().
>删除小部件并放置一个新的.
而已.
解决方法
原文地址:https://www.jb51.cc/android/311832.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。