一个人手机里面怎么那么多条微信一键清除未读消息的消息呢!还都是小红点呀 。怎么回事呢

Android系统
应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示
小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒。
但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差。但幸运的是,某些ROM厂商提供了私有的API,但也带来了难度,API的不同意意味着代码量的增加和兼容性问题更加突出。
我们现在来实现桌面logo或者说icon右上角的图标,先来看2张图,第一张来自互联网,第二张来自个人实践!(由于实验条件有限,只能测试小米的(⊙o⊙)&,有兴趣的同学测试一下其他的吧)
实现原理:
首先我们要明白 并不是应用本身处理对启动图标进行修改、图标的动态修改的过程主要是在Launcher里面完成的.在应用安装,更新,卸载的时候,都会有广播发出,Launcher在LauncherApplication 中注册广播,在LauncherModel中处理接收到广播的消息,重新加载更新应用信息(如:应用图标、文字等)。但是原生的android系统是并不支持该特性的(及不能通过发送特定的系统广播 达到动态修改启动图标的效果),但是在强大的第三方Android手机厂商(如:三星、小米)的系统深度定制下、通过修改了Launcher源代码,增加/注册了新的广播接收器用来接收应用发送来的未读消息数广播,接收到广播后,系统将未读消息的数目显示事件交给Launcher去处理,调用相关方法去重绘应用的icon,最终达到动态更新应用图标的效果。
public class MainActivity extends Activity {
//必须使用,Activity启动页
private final static String lancherActivityClassName = Welcome.class.getName();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.common_listview_layout);
protected void onResume() {
super.onResume();
sendBadgeNumber();
private void sendBadgeNumber() {
String number = &35&;
if (TextUtils.isEmpty(number)) {
number = &0&;
int numInt = Integer.valueOf(number);
number = String.valueOf(Math.max(0, Math.min(numInt, 99)));
if (Build.MANUFACTURER.equalsIgnoreCase(&Xiaomi&)) {
sendToXiaoMi(number);
} else if (Build.MANUFACTURER.equalsIgnoreCase(&samsung&)) {
sendToSony(number);
} else if (Build.MANUFACTURER.toLowerCase().contains(&sony&)) {
sendToSamsumg(number);
Toast.makeText(this, &Not Support&, Toast.LENGTH_LONG).show();
private void sendToXiaoMi(String number) {
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification =
boolean isMiUIV6 =
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(&您有&+number+&未读消息&);
builder.setTicker(&您有&+number+&未读消息&);
builder.setAutoCancel(true);
builder.setSmallIcon(R.drawable.common_icon_lamp_light_red);
builder.setDefaults(Notification.DEFAULT_LIGHTS);
notification = builder.build();
//以上代码为notification的初始化信息,在实际应用中,可以单独使用
Class miuiNotificationClass = Class.forName(&android.app.MiuiNotification&);
Object miuiNotification = miuiNotificationClass.newInstance();
Field field = miuiNotification.getClass().getDeclaredField(&messageCount&);
field.setAccessible(true);
field.set(miuiNotification, number);// 设置信息数
field = notification.getClass().getField(&extraNotification&);
field.setAccessible(true);
field.set(notification, miuiNotification);
Toast.makeText(this, &Xiaomi=&isSendOk=&1&, Toast.LENGTH_LONG).show();
}catch (Exception e) {
e.printStackTrace();
//miui 6之前的版本
isMiUIV6 =
Intent localIntent = new Intent(&android.intent.action.APPLICATION_MESSAGE_UPDATE&);
localIntent.putExtra(&android.intent.extra.update_application_component_name&,getPackageName() + &/&+ lancherActivityClassName );
localIntent.putExtra(&android.intent.extra.update_application_message_text&,number);
sendBroadcast(localIntent);
if(notification!=null && isMiUIV6 )
//miui6以上版本需要使用通知发送
nm.notify(101010, notification);
private void sendToSony(String number) {
boolean isShow =
if (&0&.equals(number)) {
Intent localIntent = new Intent();
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE&,isShow);//是否显示
localIntent.setAction(&com.sonyericsson.home.action.UPDATE_BADGE&);
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME&,lancherActivityClassName );//启动页
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.MESSAGE&, number);//数字
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME&,getPackageName());//包名
sendBroadcast(localIntent);
Toast.makeText(this, &Sony,& + &isSendOk&, Toast.LENGTH_LONG).show();
private void sendToSamsumg(String number)
Intent localIntent = new Intent(&android.intent.action.BADGE_COUNT_UPDATE&);
localIntent.putExtra(&badge_count&, number);//数字
localIntent.putExtra(&badge_count_package_name&, getPackageName());//包名
localIntent.putExtra(&badge_count_class_name&,lancherActivityClassName ); //启动页
sendBroadcast(localIntent);
Toast.makeText(this, &Samsumg,& + &isSendOk&, Toast.LENGTH_LONG).show();
AndroidMainfest.xml配置
注意lancherActivityClassName 必须被配置为 启动页 android.intent.category.LAUNCHER
MIUI 桌面角标官方开源代码简介
MIUI 6上重新设计了桌面app图标的角标显示,基本规则如下:
默认的情况
当app 向通知栏发送了一条通知 (通知不带进度条并且用户可以删除的),那么桌面app icon角标就会显示1.此时app显示的角标数是和通知栏里app发送的通知数对应的,即向通知栏发送了多少通知就会显示多少角标。
通知可以定义角标数
例如 有5封未读邮件,通知栏里只会显示一条通知,但是想让角标显示5. 可以在发通知时加个标示。
第三方app需要用反射来调用,参考代码:
NotificationManager mNotificationManager = (NotificationManager) this
.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this)
.setContentTitle(&title&).setContentText(&text&).setSmallIcon(R.drawable.icon);
Notification notification = builder.build();
Field field = notification.getClass().getDeclaredField(&extraNotification&);
Object extraNotification = field.get(notification);
Method method = extraNotification.getClass().getDeclaredMethod(&setMessageCount&, int.class);
method.invoke(extraNotification, mCount);
} catch (Exception e) {
e.printStackTrace();
mNotificationManager.notify(0,notification);
封装为工具类
注意:示例源代码中MIUI系统的功能实现和官方介绍的方法不一样,工具类使用的时速官方介绍的方法
这个工具类,是参考,MIUI系统的我改了一下,测试可以,条件有限,sony和三星未测试
package cn.hdnc.BadgeU
import android.app.N
import android.content.C
import android.content.I
import android.content.pm.PackageM
import android.content.pm.ResolveI
import android.os.B
import android.widget.T
import java.lang.reflect.F
import java.lang.reflect.M
* 应用启动图标未读消息数显示 工具类
(效果如:QQ、微信、未读短信 等应用图标)
* 依赖于第三方手机厂商(如:小米、三星)的Launcher定制、原生系统不支持该特性
* 该工具类 支持的设备有 小米、三星、索尼【其中小米、三星亲测有效、索尼未验证】
* @author ice_
public class BadgeUtil {
* Set badge count
* 针对 Samsung / xiaomi / sony 手机有效
* @param context The context of the application package.
* @param count Badge count to be set
public static void setBadgeCount(Notification notification,Context context, int count) {
if (count &= 0) {
count = 0;
count = Math.max(0, Math.min(count, 99));
if (Build.MANUFACTURER.equalsIgnoreCase(&Xiaomi&)) {
sendToXiaoMi(notification, context, count);
} else if (Build.MANUFACTURER.equalsIgnoreCase(&sony&)) {
sendToSony(context, count);
} else if (Build.MANUFACTURER.toLowerCase().contains(&samsung&)) {
sendToSamsumg(context, count);
Toast.makeText(context, &Not Support&, Toast.LENGTH_LONG).show();
* 向小米手机发送未读消息数广播
* @param count
private static void sendToXiaoMi(Notification notification,Context context, int count) {
Class miuiNotificationClass = Class.forName(&android.app.MiuiNotification&);
Object miuiNotification = miuiNotificationClass.newInstance();
Field field = miuiNotification.getClass().getDeclaredField(&messageCount&);
field.setAccessible(true);
field.set(miuiNotification, String.valueOf(count == 0 ? && : count));
// 设置信息数--&这种发送必须是miui 6才行
Field field = notification.getClass().getDeclaredField(&extraNotification&);
Object extraNotification = field.get(notification);
Method method = extraNotification.getClass().getDeclaredMethod(&setMessageCount&, int.class);
method.invoke(extraNotification, count);
} catch (Exception e) {
e.printStackTrace();
// miui 6之前的版本
Intent localIntent = new Intent(
&android.intent.action.APPLICATION_MESSAGE_UPDATE&);
localIntent.putExtra(
&android.intent.extra.update_application_component_name&,
context.getPackageName() + &/& + getLauncherClassName(context));
localIntent.putExtra(
&android.intent.extra.update_application_message_text&, String.valueOf(count == 0 ? && : count));
context.sendBroadcast(localIntent);
* 向索尼手机发送未读消息数广播
* 据说:需添加权限: [未验证]
* @param count
private static void sendToSony(Context context, int count){
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
boolean isShow =
if (count == 0) {
Intent localIntent = new Intent();
localIntent.setAction(&com.sonyericsson.home.action.UPDATE_BADGE&);
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE&,isShow);//是否显示
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME&,launcherClassName );//启动页
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.MESSAGE&, String.valueOf(count));//数字
localIntent.putExtra(&com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME&, context.getPackageName());//包名
context.sendBroadcast(localIntent);
* 向三星手机发送未读消息数广播
* @param count
private static void sendToSamsumg(Context context, int count){
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
Intent intent = new Intent(&android.intent.action.BADGE_COUNT_UPDATE&);
intent.putExtra(&badge_count&, count);
intent.putExtra(&badge_count_package_name&, context.getPackageName());
intent.putExtra(&badge_count_class_name&, launcherClassName);
context.sendBroadcast(intent);
* 重置、清除Badge未读显示数
* @param context
public static void resetBadgeCount(Notification notification,Context context) {
setBadgeCount(notification, context, 0);
* Retrieve launcher activity name of the application from the context
* @param context The context of the application package.
* @return launcher activity name of this application. From the
&android:name& attribute.
private static String getLauncherClassName(Context context) {
PackageManager packageManager = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
// To limit the components this Intent will resolve to, by setting an
// explicit package name.
intent.setPackage(context.getPackageName());
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// All Application must have 1 Activity at least.
// Launcher activity must be found!
ResolveInfo info = packageManager
.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
// get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER
// if there is no Activity which has filtered by CATEGORY_DEFAULT
if (info == null) {
info = packageManager.resolveActivity(intent, 0);
return info.activityInfo.博客分类:
本文属于原创,转载请著名出处:
在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。
本节就以一个展示手机内联系人数量的例子来演示怎么在一个图标的上面加上数字的例子,也就是一个数字overlay..做过google map开发的知道overlay这个东西。。
一:你可学到
手机内依据Uri查看联系人
权限的添加
获取手机内任意一款应用的应用图标
对图形的处理,如复制,为图片加上覆盖层--数字。
使用RemoteView自定义Notification
二:开始行动
新建名为NotificationIconCount的Android Project。附件中有最终版本的项目工程
首先修改AndroidManifest.xml,加入权限&uses-permission android:name="android.permission.READ_CONTACTS"&&/uses-permission&,因为我们要读取联系人。
修改main.xml如下,这里定义一个ImageView,勇于预览我们处理好的加上数字的图标。&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
&ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
android:adjustViewBounds="true"/&
&/LinearLayout&
先来获取手机内通讯录的图标,如果没有获取到,则使用该应用的图标.super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mImageView=(ImageView)findViewById(R.id.icon);
//优先采用联系人的图标,如果不存在则采用该应用的图标
Drawable contactI
contactIcon = getPackageManager().getApplicationIcon("com.android.contacts");
} catch (NameNotFoundException e) {
contactIcon=
if(contactIcon instanceof BitmapDrawable){
icon=((BitmapDrawable)contactIcon).getBitmap();
icon=getResIcon(getResources(), R.id.icon);
这里用到一个自定义的根据资源图标id获取图片的函数,很简单,代码如下:
* 根据id获取一个图片
* @param res
* @param resId
private Bitmap getResIcon(Resources res,int resId){
Drawable icon=res.getDrawable(resId);
if(icon instanceof BitmapDrawable){
BitmapDrawable bd=(BitmapDrawable)
return bd.getBitmap();
获取到图标之后就要对这个图标进行处理了,要为该图标加上联系人数量的覆盖,首先我们看获取联系人个数的函数。/**
* 获取联系人的个数
* @return 手里通讯录中联系人的个数
private int getContactCount(){
Cursor c=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._COUNT}, null, null, null);
c.moveToFirst();
return c.getInt(0);
}catch(Exception e){
c.close();
这里采用Uri的方式获取联系人的cursor,然后获取个数。
有了图标和联系人个数就可以生成带联系人个数的图标了,我们看下生成的这个函数。/**
* 在给定的图片的右上角加上联系人数量。数量用红色表示
* @param icon 给定的图片
* @return 带联系人数量的图片
private Bitmap generatorContactCountIcon(Bitmap icon){
//初始化画布
int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size);
Log.d(TAG, "the icon size is "+iconSize);
Bitmap contactIcon=Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
Canvas canvas=new Canvas(contactIcon);
//拷贝图片
Paint iconPaint=new Paint();
iconPaint.setDither(true);//防抖动
iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight());
Rect dst=new Rect(0, 0, iconSize, iconSize);
canvas.drawBitmap(icon, src, dst, iconPaint);
//在图片上创建一个覆盖的联系人个数
int contacyCount=getContactCount();
//启用抗锯齿和使用设备的文本字距
Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG);
countPaint.setColor(Color.RED);
countPaint.setTextSize(20f);
countPaint.setTypeface(Typeface.DEFAULT_BOLD);
canvas.drawText(String.valueOf(contacyCount), iconSize-18, 25, countPaint);
return contactI
注释的很详细,就不解释了,无非就是定义一个画布(Canvas),然后在上面画图标,画数字文本。
然后我们把得到的这个处理过的Bitmap放在我们在main.xml里定义的ImageView里展示就可以看到效果了.mImageView.setImageBitmap(contactCountIcon);
我们启动应用看看效果.
我们看到了,右上角红色的1代表我手机中有一个联系人
三:采用状态栏通知的办法展示联系人的数量
如果我们监听未读短信的数量,展示在状态栏通知了,就可以用这个方法,我这里还是以联系人的数量为例
由于Notification默认的icon字段使用的是一个一个资源的引用类型int,所以我们这里采用RemoteView的方式自定义Notification。定义RemoteView,需要一个layout,用于定义展示的Notification样式,我们新建一个notification.xml布局文件如下:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="3dp"
&ImageView android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="10dp"
&TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:textColor="#000"
&/LinearLayout&
很简单,一个ImageView和一个TextView,用于显示提示的图标和文字。
要想使用Notification,我们必须获取一个Service--NotificationManager,Android中由它来管理我们的Notification,获取NotificationManager的代码如下,卸载onCreate方法里nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
然后紧接着我们就调用我们定义好的方法来显示通知:showNotifacation(contactCountIcon);
下面我们看一下方法showNotifacation的具体实现:
* 显示状态栏通知
* @param icon 通知内容图标
private void showNotifacation(Bitmap icon){
Notification notification=new
Notification(R.drawable.icon,"联系人数量",System.currentTimeMillis());
//使用RemoteView自定义通知视图
RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.notification);
contentView.setImageViewBitmap(R.id.image, icon);
contentView.setTextViewText(R.id.text, "图标上的红色数字表示手机中联系人的数量");
notification.contentView=contentV
Intent notificationIntent=new Intent(this, NotificationIconActivity.class);
PendingIntent contentIntent=PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.contentIntent=contentI
nm.notify(NOTIFICATION_CONTACT_ID, notification);
注释的都很详细,就不一一解释了
最后的就是重写onDestroy,在Android销毁该Activity的时候清除我们的通知。
protected void onDestroy() {
super.onDestroy();
nm.cancel(NOTIFICATION_CONTACT_ID);
运行,可以看到如下效果
可以看到,效果已经出来了。。
四:小结和一点引申
这结的主要关键还是对图片的处理,比如这里的加上数字,当时你也可以加上其他的东西,Canvas里有很多相应的函数可以使用。。
这里说的都是应用内、状态通知等一些显示处理后图片的办法,那么有没有方法处理手机主屏幕上的图标的办法,为他们加上数字呢。比如在短信息的应用图标的右上角加上未读短信数目等,答案是有的,不过是迂回实现的,给个思路就是使用AppWidget,这个可以实现,还能动态更新,具体怎么实现,大家可以自己摸索下,这里只提供个思路,整体和这节的例子差不多,只不过呢,要做成AppWidget。。。
下载次数: 1693
浏览 56544
[u][b][/b][/u]
浏览: 910601 次
来自: 深圳
浏览量:141618
感谢,看完了
import ja ...
Nginx在高并发的时候,内存开销比Apache更加有优势!
不错,写的非常不错
不允许加入了,呜呜呜。。。。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'微信桌面图标显示未读消息怎么开启,微信桌面图标上显示有十条未读信息-记住吧
微信桌面图标显示未读消息怎么开启
微信桌面图标上显示有十条未读信息
:怎么让微信图标右上角显示未读消息数量点击“设置”;点击“通知和状态栏”;点击“通知管理”;点开“通知管理”上侧显示禁止推送通知的程序,下侧显示允许推送通知的程序;向上滑动手机屏,找到,点开;点击“桌面图标角标”关闭后,不再在手机桌面图标右上角显示数字角标提示;如点击“允许通知”关闭后,则不会其他相应类型的通知。:怎么让微信图标右上角显示未读消息数量的红点?方法:打开手机的设置——通知(手机不同会有不一样,但是这个基本都是在设置里找的,你看看那个意思上一样的就行)2.通知管理。然后在一堆应用程序里找到微信,点击3.选择角标4.右上角的就是角标啦:微信图标上总有未读消息。进入手机设定-应用程序管理器-已下载-点击出现问题的应用-清除数据尝试追问:是不是清楚了,聊天记录也没有了?还有。我没看到什么清楚数据。:微信接收到新消息后,微信图标上怎么不显示几条未读信息可以尝试以下方法进行解决:1、进入设置--更多设置--应用程序--全部找到并清除该程序的数据试试2、尝试重启手机打开通知栏一键清理后台程序再重新打开试试3、您可以将该软件更新到最新版本试试的,您也可以将该软件卸载掉更换其他下载资源下载试试的如百度应用应用商店安卓市场等。4、可以将手机系统更新到最新版本试试的,您可以进入设置->更多设置->系统升级->系统。立即检查更新-,根据提示下载升级包,点击校验并安装,手机会重启自动进入升级模式,升级您手机的。:微信未读信息为什么在图标上不显示条数?进手机设置,找到应用管理中的微信,再找自定义通知,把桌面图标角标设置为开1、这个问题涉及到两个方面的问题,一个是微信软件的设置,一个是手机硬件的设置。2、先说一说软件设置的问题:打开微信,轻触导航栏(下边栏)中的“我”,在新页面中找到【设置】。3、打开设置,在设置页面,再点击打开【新消息提醒】,开启接收新消息通知,当然还有相关的其它设置。4、以上是软件设置,下面硬件设置,找到手机的设置,一般的图标就是一个小齿轮的那个,打开后找到【安全与隐私】部分,在这个分类下找到【通知管理】。5、打开通知管理,在里面找到微信,对于软件的推送的通知,手机有三种管理方式:允许、提示、禁止,只有把微信设置成【允许】,这样当有新消息时,才能及时地收到提示。
小提示:内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
声明:本文由网友整理有关微信桌面图标显示未读消息怎么开启,微信桌面图标上显示有十条未读信息的内容,如因分享而侵犯到您的合法权益,请联系我们删除。}

我要回帖

更多关于 微信总显示未读消息1 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信