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 />
元素来在清单文件中指定它.
然后创建包含 ContentObserver
的 MyApplication
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();
}
}
}
我已使用 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 />
元素来在清单文件中指定它.
然后创建包含 ContentObserver
的 MyApplication
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();
}
}
}