前言
aaa.png消息通知是大多数用户类app都会用到的功能,这里介绍的是当有新消息的时候,app的桌面图标像微信和qq那样右上角出现红色的消息数量红点。实现代码分为
8.0-版本
和8.0+版本
。
android 8.0+ (版本号 26 名称 O)
8.0+
的系统直接使用新版本的消息通知渠道NotificationChannel
即可设置桌面红点
//测试通知
public void testNotify(View v) {
NotificationCompat.Builder builder;
//8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder = new NotificationCompat.Builder(this, getChannelId());
} else {
builder = new NotificationCompat.Builder(this, null);
//8.0以下版本桌面红点显示
// TODO: 2018/8/2
}
builder.setSmallIcon(R.mipmap.ic_launcher)
.setDefaults(Notification.DEFAULT_ALL)
.setTicker("title")
.setAutoCancel(true)
.setContentTitle("contentTitle")
.setContentText("contentText");
mNotificationManager.notify(123, builder.build());
}
@RequiresApi(api = Build.VERSION_CODES.O)
public String getChannelId() {
final String channelId = "1";
final String channelName = "com.mmc.tj";
NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
channel.enableLights(true);//显示桌面红点
channel.setLightColor(Color.RED);
channel.setShowBadge(true);
mNotificationManager.createNotificationChannel(channel);
return channel.getId();
}
android 8.0以下版本
8.0
以下版本的桌面红点需要借助开源库ShortcutBadger,这个库是专门用来帮助Android开发者快速生成桌面角标的。这个库并不是所有的机型都适配,对于主流的华为
,xiaomi
,三星
,oppo
支持,魅族和酷派等就不行,使用方法其实很简单,在github主页都有介绍:
//测试通知
public void testNotify(View v) {
NotificationCompat.Builder builder;
//8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder = new NotificationCompat.Builder(this, getChannelId());
} else {
builder = new NotificationCompat.Builder(this, null);
//8.0以下版本桌面红点显示
ShortcutBadger.applyCount(context, ++sMessageCount);
}
builder.setSmallIcon(R.mipmap.ic_launcher)
.setDefaults(Notification.DEFAULT_ALL)
.setTicker("title")
.setAutoCancel(true)
.setContentTitle("contentTitle")
.setContentText("contentText");
mNotificationManager.notify(123, builder.build());
}
红点的取消
8.0+的系统不用我们去实现,app运行为前台进程时就自动取消了。对于
8.0-
版本通过ShortcutBadger
库实现的,我们依然希望只要app任何一个界面一打开,就能取消红点,实现的思路如下
//创建一个Application.ActivityLifecycleCallbacks,该类可以监听每一个activity的生命周期
public class BaseAppLifeCycle implements Application.ActivityLifecycleCallbacks {
public void init(Application application) {
application.registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
//注册该监听以后,app的每一个activity的生命周期都会调用该callback的对应方法
@Override
public void onActivityResumed(Activity activity) {
//app不管哪个界面可见,桌面红点即消失
ShortcutBadger.applyCount(context,0);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
//在Application中注册该监听
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
new BaseAppLifeCycle().init(this);
}
}
网友评论