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

原创
2014/12/04 15:33
阅读数 4W

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

展开阅读全文
打赏
7
36 收藏
分享
加载中

引用来自“IamOkay”的评论

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

引用来自“1985”的评论

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

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

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

引用来自“isOkay”的评论

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

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

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

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

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

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

引用来自“cc_c”的评论

在吗,能发我一份代码吗?qq邮箱:1042263316@qq.com,叩谢
谁又这个的源码 能分享一下吗
2016/10/24 08:25
回复
举报
大哥 能给一下你的源码吗 956818198@qq.com
2016/10/22 13:23
回复
举报

引用来自“IamOkay”的评论

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

引用来自“1985”的评论

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

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

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

引用来自“isOkay”的评论

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

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

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

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

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

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

引用来自“licnep”的评论

去掉这个flag值就可以了 : Notification.FLAG_NO_CLEAR
在每次发布通知前,可以先清除一下通知
大兄弟你是怎么做的求解
2016/05/30 09:22
回复
举报
去掉这个flag值就可以了 : Notification.FLAG_NO_CLEAR
在每次发布通知前,可以先清除一下通知
2016/05/20 15:52
回复
举报

引用来自“IamOkay”的评论

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

引用来自“1985”的评论

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

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

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

引用来自“isOkay”的评论

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

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

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

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

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

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

引用来自“wzystal”的评论

求github链接~
https://github.com/leolin310148/ShortcutBadger
2016/01/21 15:51
回复
举报

引用来自“1985”的评论

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

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

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

引用来自“IamOkay”的评论

是吗,还有这问题?我试试吧,对不起了各位
不知道这个问题解决了么?我现在也是这问题,第一次还能显示,第二次和之后设置都不能显示了。
2016/01/18 15:33
回复
举报

引用来自“IamOkay”的评论

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

引用来自“1985”的评论

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

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

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

引用来自“isOkay”的评论

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

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

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

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

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

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅
求github链接~
2015/12/08 11:39
回复
举报

引用来自“IamOkay”的评论

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

引用来自“1985”的评论

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

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

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

引用来自“isOkay”的评论

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

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

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

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

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

上周在github上发现一个比较全面的库,各位不防去试试,我这主要设备简陋,工作有些忙,顾不上大家,请见谅
求github库的链接~
2015/12/08 11:37
回复
举报
更多评论
打赏
28 评论
36 收藏
7
分享
返回顶部
顶部