ContentObserver在一段时间后停止工作

时间:2015-01-06 13:40:51

标签: android android-4.4-kitkat android-appwidget contentobserver

我正在用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必须已取消注册。

1 个答案:

答案 0 :(得分:1)

我遇到过类似的问题。我的解决方案是向AppWidgetProvider广播一个自定义的意图动作,因为它是一个接收器。