Android - 自动更新来自内容提供商的应用程序图标徽章计数器?

Android - Auto update app icon badge counter from content provider?

我已使用 this solution 向我的应用程序图标添加徽章计数器。我正在使用计数器来显示应用 queue_table 中有多少项正在等待发送到服务器。

首先,我创建了一个 MyBootReceiver class 来在设备启动时更新徽章计数。这部分工作正常。

我需要建议的部分是在更新队列时保持徽章计数更新的正确方法。 (队列可以由应用程序的各种组件更新 - 例如,从用户手动将项目添加到队列以及从 MyIntentService 将排队的项目发送到服务器)。

我的 queue_table 可以通过应用程序中的 ContentProvider 访问,所以我本质上需要知道的是监控此内容提供者更改的最佳方式(因此可以更新徽章图标相应地)。

我想知道是否最好(或唯一)的解决方案是创建一个 MyApplication class 并在其 onCreate 方法中注册一个 ContentObserver -例如,

MyApplication.java

@Override
public void onCreate() {
    super.onCreate();

    /*
     * Register for changes in queue_table, so the app's badge number can be updated in MyObserver#onChange()
     */
    Context context = getApplicationContext();
    ContentResolver cr = context.getContentResolver();
    boolean notifyForDescendents = true;
    myObserver = new MyObserver(new Handler(), context);
    cr.registerContentObserver(myContentProviderUri, notifyForDescendents, myObserver);


}

此外,如果我确实使用这样的解决方案,我是否需要担心取消注册 myObserver,如果是,我将如何在 MyApplication 中取消注册?

我的方法是在 MyApplication class.

中使用 ContentObserver

如果您还没有 MyApplication class,您需要通过将 android:name=".MyApplication" 属性添加到 <application /> 元素来在清单文件中指定它.

然后创建包含 ContentObserverMyApplication class,如下所示:

package com.example.myapp;

import android.app.Application;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;

public class MyApplication extends Application {

    private static String LOG_TAG = MyApplication.class.getSimpleName();

    public MyApplication() {
        super();
    }

    private MyContentObserver myContentObserver = null;

    @Override
    public void onCreate() {
        super.onCreate();


        /*
         * Register for changes in tables associated with myUri, so the app's badge number can be updated in MyContentObserver#onChange()
         */
        myContentObserver = new MyContentObserver(new Handler(), this);
        ContentResolver cr = getContentResolver();
        boolean notifyForDescendents = true;
        Uri[] myUri = ...;
        cr.registerContentObserver(myUri, notifyForDescendents, myContentObserver);

    }

    private class MyContentObserver extends ContentObserver {

        public MyContentObserver(Handler handler, Context context) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            this.onChange(selfChange, null);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {

            Utilities.updateBadgeCount();

        }

    }

}