我正在用ListView编写简单的小部件。我希望获得有关数据更改的即时更新,以便创建ContentObserver。我在RemoteViewFactory后代类中注册它。
@Override
public void onCreate() {
Uri uri = Uri.parse("content://mms-sms/conversations");
final String[] projection = new String[]{"*"};
_dataCursor = _context.getContentResolver().query(uri, projection, null, null, "date DESC");
if(_smsObserver == null) {
_smsObserver = new SmsObserver(new Handler(), _context);
}
_context.getContentResolver().registerContentObserver(uri, true, _smsObserver);
}
ContentObserver在同一个类中取消注册:
@Override
public void onDestroy() {
if(_dataCursor != null && !_dataCursor.isClosed())
{
_dataCursor.close();
}
if(_smsObserver != null) {
_context.getContentResolver().unregisterContentObserver(_smsObserver);
}
}
它可以正常运行一段时间,可能只有几个小时,但是在夜晚之后,ContentObserver停止工作,我的App Widget没有得到更新。 OnChange
方法中没有高级代码。
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Intent smsIntent = new Intent(_context, SmsWidget.class);
smsIntent.setAction(SmsWidget.RELOAD_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(_context, 0, smsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
我正在使用Android 4.4.2在设备上测试我的App Widget。
我尝试将ContentObserver的注册和注销从RemoteViewsFactory
移至AppWidgetProvider
本身,转移到OnEnabled()
和OnDisabled()
方法。不幸的是,它没有按预期工作。大约8小时后,当我的AppWidget停止获取更新意图时,ContentObserver必须已取消注册。
答案 0 :(得分:1)
我遇到过类似的问题。我的解决方案是向AppWidgetProvider广播一个自定义的意图动作,因为它是一个接收器。