文档章节

Android Icon数字角标Badge的实现方式

IamOkay
 IamOkay
发布于 2014/12/04 15:33
字数 699
阅读 35201
收藏 36

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差。但幸运的是,某些ROM厂商提供了私有的API,但也带来了难度,API的不同意意味着代码量的增加和兼容性问题更加突出。

我们现在来实现桌面logo或者说icon右上角的图标,先来看2张图,第一张来自互联网,第二张来自个人实践!(由于实验条件有限,只能测试小米的(⊙o⊙)…,有兴趣的同学测试一下其他的吧)

互联网图片    个人手机接入

好了,上代码

public class MainActivity extends Activity {
      //必须使用,Activity启动页
      private final static String lancherActivityClassName = Welcome.class.getName();
      
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.common_listview_layout);
	}

	@Override
	protected void onResume() {
		super.onResume();
		sendBadgeNumber();
	}

	private void sendBadgeNumber() {
		String number = "35";
		if (TextUtils.isEmpty(number)) {
			number = "0";
		} else {
			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);
		} else {
			Toast.makeText(this, "Not Support", Toast.LENGTH_LONG).show();
		}
	}

	private void sendToXiaoMi(String number) {
		NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		Notification notification = null;
		boolean isMiUIV6 = true;
		try {
			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(); 
			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 = false;
    		    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);
		}
		finally
		{
          if(notification!=null && isMiUIV6 )
		   {
		       //miui6以上版本需要使用通知发送
			nm.notify(101010, notification); 
		   }
		}

	}

	private void sendToSony(String number) {
		boolean isShow = true;
		if ("0".equals(number)) {
			isShow = false;
		}
		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();
	}
}

注意lancherActivityClassName 必须被配置为 启动页   android.intent.category.LAUNCHER

 <activity
            android:name="com.sample.activites.Welcome"
            android:configChanges="locale|keyboard|screenSize"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT" />
            </intent-filter>
        </activity>



try doing it

© 著作权归作者所有

IamOkay

IamOkay

粉丝 205
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
加载中

评论(28)

o
oschinawwt

引用来自“IamOkay”的评论

引用来自“陌路拾荒”的评论

引用来自“1985”的评论

有个疑问啊,出现角标以后,点击带角标的icon,再次进入应用,切后台,这时候角标就无法出现了?????

引用来自“李京502”的评论

你解决了吗? 我现在也是这种问题,第一次能显示角标,后面就显示不了了。

引用来自“isOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位

引用来自“李京502”的评论

楼主出现了。。像小米这种的,有什么解决思路吗。。

引用来自“明小小”的评论

楼主解决了吗?我也是这种情况,小米会出现!急~!
楼主小米的问题解决了么,只能是1

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅

引用来自“cc_c”的评论

在吗,能发我一份代码吗?qq邮箱:1042263316@qq.com,叩谢
谁又这个的源码 能分享一下吗
o
oschinawwt
大哥 能给一下你的源码吗 956818198@qq.com
c
cc_c

引用来自“IamOkay”的评论

引用来自“陌路拾荒”的评论

引用来自“1985”的评论

有个疑问啊,出现角标以后,点击带角标的icon,再次进入应用,切后台,这时候角标就无法出现了?????

引用来自“李京502”的评论

你解决了吗? 我现在也是这种问题,第一次能显示角标,后面就显示不了了。

引用来自“isOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位

引用来自“李京502”的评论

楼主出现了。。像小米这种的,有什么解决思路吗。。

引用来自“明小小”的评论

楼主解决了吗?我也是这种情况,小米会出现!急~!
楼主小米的问题解决了么,只能是1

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅
在吗,能发我一份代码吗?qq邮箱:1042263316@qq.com,叩谢
c
cc_c
为什么我小米4运行起来没任何反应,求各位指点
lucifesar
lucifesar

引用来自“licnep”的评论

去掉这个flag值就可以了 : Notification.FLAG_NO_CLEAR
在每次发布通知前,可以先清除一下通知
大兄弟你是怎么做的求解
l
licnep
去掉这个flag值就可以了 : Notification.FLAG_NO_CLEAR
在每次发布通知前,可以先清除一下通知
s
syab11

引用来自“IamOkay”的评论

引用来自“陌路拾荒”的评论

引用来自“1985”的评论

有个疑问啊,出现角标以后,点击带角标的icon,再次进入应用,切后台,这时候角标就无法出现了?????

引用来自“李京502”的评论

你解决了吗? 我现在也是这种问题,第一次能显示角标,后面就显示不了了。

引用来自“isOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位

引用来自“李京502”的评论

楼主出现了。。像小米这种的,有什么解决思路吗。。

引用来自“明小小”的评论

楼主解决了吗?我也是这种情况,小米会出现!急~!
楼主小米的问题解决了么,只能是1

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅

引用来自“wzystal”的评论

求github链接~
https://github.com/leolin310148/ShortcutBadger
leiving123
leiving123

引用来自“1985”的评论

有个疑问啊,出现角标以后,点击带角标的icon,再次进入应用,切后台,这时候角标就无法出现了?????

引用来自“李京502”的评论

你解决了吗? 我现在也是这种问题,第一次能显示角标,后面就显示不了了。

引用来自“IamOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位
不知道这个问题解决了么?我现在也是这问题,第一次还能显示,第二次和之后设置都不能显示了。
w
wzystal

引用来自“IamOkay”的评论

引用来自“陌路拾荒”的评论

引用来自“1985”的评论

有个疑问啊,出现角标以后,点击带角标的icon,再次进入应用,切后台,这时候角标就无法出现了?????

引用来自“李京502”的评论

你解决了吗? 我现在也是这种问题,第一次能显示角标,后面就显示不了了。

引用来自“isOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位

引用来自“李京502”的评论

楼主出现了。。像小米这种的,有什么解决思路吗。。

引用来自“明小小”的评论

楼主解决了吗?我也是这种情况,小米会出现!急~!
楼主小米的问题解决了么,只能是1

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅
求github链接~
w
wzystal

引用来自“IamOkay”的评论

引用来自“陌路拾荒”的评论

引用来自“1985”的评论

有个疑问啊,出现角标以后,点击带角标的icon,再次进入应用,切后台,这时候角标就无法出现了?????

引用来自“李京502”的评论

你解决了吗? 我现在也是这种问题,第一次能显示角标,后面就显示不了了。

引用来自“isOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位

引用来自“李京502”的评论

楼主出现了。。像小米这种的,有什么解决思路吗。。

引用来自“明小小”的评论

楼主解决了吗?我也是这种情况,小米会出现!急~!
楼主小米的问题解决了么,只能是1

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅
求github库的链接~
ReactNative自定义Avatar&Badge组件

功能 显示本地图片以及网络图片 使用名字的字母作为图像 显示border 设置圆角大小 设置未读消息 设置右上角Icon角标 自动适配badge大小 代码基于两个开源库并进行了简化和封装 https://gith...

大苞米
2018/01/23
0
0
应用程序添加角标和tabBar添加角标,以及后台运行时显示

1、设置角标的代码: 2、在给应用程序发送角标设置的时候,可能会报以下错误: “Attempting to badge the application icon but haven't received permission from” 这是因为一切都是iOS8捣...

远0
2017/09/25
0
0
Android软件开发之TextView详解(六)

Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6625662 TextView的API 中文文档中 说明...

彭博
2012/03/09
122
0
Android软件开发之TextView详解(六)

Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6625662 TextView的API 中文文档中 说明...

晨曦之光
2012/03/07
743
0
关于实现Android平台桌面角标的问题

@isOkay 您好,想跟您请教个问题:关于您的这篇博文——Android系统 小米/三星/索尼 桌面角标数字设置 我想问一下,其中的广播名和Intent携带的数据的参数名是如何获取到的?...

Free_man
2015/07/21
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 我的视频网站vip账号和我厚脸皮的朋友们

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Cobbage :分享小海的单曲《衡山路(2016现场版)》: 《衡山路(2016现场版)》- 小海 手机党少年们想听歌,请使劲儿戳(这里) @FalconChe...

小小编辑
今天
6
0
Spring Cloud Alibaba 实战(十二) - Nacos配置管理

> 本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理的意义 项目...

JavaEdge
今天
9
0
面试官问你编码相关的面试题,把这篇甩给他就完事!

前情回顾:Java中一个字符占两字节 但为什么new String("字").getBytes().length 返回3个字节 今天主要聊一聊: 字节 字符 字符集 编码 字符编码 Java 内码和外码 Unicode 字节 例如 :00001...

gzc426
今天
10
0
写的简单sh脚本2

#!/bin/bashexport LANG="en_US.UTF-8"#chmod +x filename 记得给文件加可执行权限#./vsimstart.sh#启动vsim项目echo "start vism"#207------------------------------assets=vsim-a......

hexiaoming123
昨天
7
0
java基础(1)变量和常量

概要和总结: 数据类型图: 基本数据类型:只有基本功能-----保存数据 (4类8种)byte-short-int-long-float-double-char-boolean 引用数据类型:有更多功能,保存数据,处理数据...

煌sir
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部