【问题标题】:Browser ContentObserver not being called even using different URI's即使使用不同的 URI,也不会调用浏览器 ContentObserver
【发布时间】:2014-08-26 22:13:03
【问题描述】:

我的用于观察浏览器历史记录的 ContentObserver 没有被调用。我不明白为什么不是。我没有做任何不同或奇怪的事情,我完全遵循 API 规范,但无济于事!以下是我的代码:

为我服务:

public class MonitorService extends Service {
    //some global variables declared here
    private ContentObserver historyObserver, searchObserver, chromeObserver;

    public void onCreate() {
        super.onCreate();
        isRunning = false;
        this.preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        //this.historyObserver = new HistoryObserver();
        this.historyObserver = new HistoryObserver(new Handler());
        this.searchObserver = new HistoryObserver(new Handler());
        this.chromeObserver = new HistoryObserver(new Handler());

        getApplicationContext().getContentResolver().registerContentObserver(Uri.parse("content://com.android.chrome.browser/history"), false, this.chromeObserver);
        getApplicationContext().getContentResolver().registerContentObserver(android.provider.Browser.BOOKMARKS_URI, false, this.historyObserver);
        getApplicationContext().getContentResolver().registerContentObserver(android.provider.Browser.SEARCHES_URI, false, this.searchObserver);
    }
//Other required methods in class
}//end of class

然后在我的 HistoryObserver 类中我们有:

public class HistoryObserver extends ContentObserver {

    public final String TAG = "HistoryObserver";

    public HistoryObserver(Handler handler) {
        super(handler);
        Log.d(TAG, "Creating new HistoryObserver");
    }

    public HistoryObserver() {
        super(null);
        Log.d(TAG, "Creating a new HistoryObserver without a Handler");
    }

    @Override
    public boolean deliverSelfNotifications() {
        Log.d(TAG, "delivering self notifications");
        return true;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Log.d(TAG, "onChange without uri: " + selfChange);
        //onChange(selfChange, null);
    }

    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        Log.d(TAG, "onChange: " + selfChange + "\t " + uri.toString());
    }
}

就像我说的,这个实现没有什么特别或独特之处。然而,当我去一个新网站或在 Chrome 中搜索某些内容时,onChange 方法永远不会被触发。

【问题讨论】:

  • 服务在活动中正确创建。我从 HistoryObserver 对象的创建中获取日志,因此我知道服务正在正确启动并且对象已正确初始化。
  • 我的实现基本上与此相同:stackoverflow.com/questions/18987919/…,但我的不起作用:(

标签: java android google-chrome browser-history observers


【解决方案1】:

我发现了问题所在。 /history 内容提供者不是可观察的。 observables 来自 /bookmark uri。一旦我发现了这一点,事情就变得非常迅速而且非常好。

【讨论】:

  • Chrome 的 ContentObserver 是否仍然适用于当前官方稳定的 Chrome 版本 39.0.2171.59?我将版本 33 与当前版本进行了比较,在当前版本中,书签/历史观察者不再被触发......
  • 我不知道。该项目是一个有限的项目——使用了一周然后关闭。所以我不能为你回答这个问题。
  • 对于当前版本的 Chrome,它应该再次为提供程序路径提供“.../history”。看到这个问题:code.google.com/p/chromium/issues/detail?id=433804
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多