Вопрос:
Я использовал это решение, чтобы добавить счетчик значков к значку моего приложения. Я использую счетчик, чтобы показать, сколько элементов есть в приложении queue_table, ожидающих отправки на сервер.
Прежде всего, я создал класс MyBootReceiver который обновляет количество значков, когда устройство загружается. Эта часть работает нормально.
Часть, в которой мне нужен совет, – это правильный способ обновить количество значков всякий раз, когда очередь обновляется. (Очередь может быть обновлена различными компонентами приложения, например, от пользователя вручную добавляет элементы в очередь и из MyIntentService отправляя на сервер поставленные очереди).
Моя queue_table доступна через ContentProvider в приложении, поэтому мне, по сути, нужно знать, это лучший способ отслеживать этот контент-провайдер для изменений (так что значок значка может быть соответствующим образом обновлен).
Мне интересно, будет ли лучшее (или единственное) решение для меня создать класс MyApplication который регистрирует ContentObserver в методе onCreate – например,
MyApplication.java
@Override public void onCreate() { super.onCreate(); /* * Register for changes in queue_table, so the app 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 регистрации myObserver и если да, то как мне это сделать в MyApplication?
Лучший ответ:
То, как я это делал, это использовать ContentObserver в моем классе MyApplication.
Если у вас уже MyApplication класса MyApplication, вам нужно указать его в файле манифеста, добавив атрибут android:name=».MyApplication» к вашему элементу <application/>.
Затем вы создаете класс MyApplication который содержит ContentObserver следующим образом:
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 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(); } } }