Android Icon数字角标(BadgeNumber)的实现方式
http://blog.youkuaiyun.com/janice0529/article/details/44344169
Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差。但幸运的是,某些ROM厂商提供了私有的API,但也带来了难度,API的不同意意味着代码量的增加和兼容性问题更加突出。
我们现在来实现桌面logo或者说icon右上角的图标,先来看2张图,第一张来自互联网,第二张来自个人实践!(由于实验条件有限,只能测试小米的(⊙o⊙)…,有兴趣的同学测试一下其他的吧)
好了,上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
<code
class
=
"hljs java"
><span
class
=
"hljs-keyword"
>
public
<span
class
=
"hljs-class"
><span
class
=
"hljs-keyword"
>
class
<span
class
=
"hljs-title"
>MainActivity <span
class
=
"hljs-keyword"
>
extends
<span
class
=
"hljs-title"
>Activity {
<span
class
=
"hljs-comment"
>
//必须使用,Activity启动页
<span
class
=
"hljs-keyword"
>
private
<span
class
=
"hljs-keyword"
>
final
<span
class
=
"hljs-keyword"
>
static
String lancherActivityClassName = Welcome.
class
.getName();
<span
class
=
"hljs-meta"
>
@Override
<span
class
=
"hljs-function"
><span
class
=
"hljs-keyword"
>
protected
<span
class
=
"hljs-keyword"
>
void
<span
class
=
"hljs-title"
>onCreate<span
class
=
"hljs-params"
>(Bundle savedInstanceState) {
<span
class
=
"hljs-keyword"
>
super
.onCreate(savedInstanceState);
setContentView(R.layout.common_listview_layout);
}
<span
class
=
"hljs-meta"
>
@Override
<span
class
=
"hljs-function"
><span
class
=
"hljs-keyword"
>
protected
<span
class
=
"hljs-keyword"
>
void
<span
class
=
"hljs-title"
>onResume<span
class
=
"hljs-params"
>() {
<span
class
=
"hljs-keyword"
>
super
.onResume();
sendBadgeNumber();
}
<span
class
=
"hljs-function"
><span
class
=
"hljs-keyword"
>
private
<span
class
=
"hljs-keyword"
>
void
<span
class
=
"hljs-title"
>sendBadgeNumber<span
class
=
"hljs-params"
>() {
String number = <span
class
=
"hljs-string"
>
"35"
;
<span
class
=
"hljs-keyword"
>
if
(TextUtils.isEmpty(number)) {
number = <span
class
=
"hljs-string"
>
"0"
;
} <span
class
=
"hljs-keyword"
>
else
{
<span
class
=
"hljs-keyword"
>
int
numInt = Integer.valueOf(number);
number = String.valueOf(Math.max(<span
class
=
"hljs-number"
>
0
, Math.min(numInt, <span
class
=
"hljs-number"
>
99
)));
}
<span
class
=
"hljs-keyword"
>
if
(Build.MANUFACTURER.equalsIgnoreCase(<span
class
=
"hljs-string"
>
"Xiaomi"
)) {
sendToXiaoMi(number);
} <span
class
=
"hljs-keyword"
>
else
<span
class
=
"hljs-keyword"
>
if
(Build.MANUFACTURER.equalsIgnoreCase(<span
class
=
"hljs-string"
>
"samsung"
)) {
sendToSony(number);
} <span
class
=
"hljs-keyword"
>
else
<span
class
=
"hljs-keyword"
>
if
(Build.MANUFACTURER.toLowerCase().contains(<span
class
=
"hljs-string"
>
"sony"
)) {
sendToSamsumg(number);
} <span
class
=
"hljs-keyword"
>
else
{
Toast.makeText(<span
class
=
"hljs-keyword"
>
this
, <span
class
=
"hljs-string"
>
"Not Support"
, Toast.LENGTH_LONG).show();
}
}
<span
class
=
"hljs-function"
><span
class
=
"hljs-keyword"
>
private
<span
class
=
"hljs-keyword"
>
void
<span
class
=
"hljs-title"
>sendToXiaoMi<span
class
=
"hljs-params"
>(String number) {
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = <span
class
=
"hljs-keyword"
>
null
;
<span
class
=
"hljs-keyword"
>
boolean
isMiUIV6 = <span
class
=
"hljs-keyword"
>
true
;
<span
class
=
"hljs-keyword"
>
try
{
NotificationCompat.Builder builder = <span
class
=
"hljs-keyword"
>
new
NotificationCompat.Builder(<span
class
=
"hljs-keyword"
>
this
);
builder.setContentTitle(<span
class
=
"hljs-string"
>
"您有"
+number+<span
class
=
"hljs-string"
>
"未读消息"
);
builder.setTicker(<span
class
=
"hljs-string"
>
"您有"
+number+<span
class
=
"hljs-string"
>
"未读消息"
);
builder.setAutoCancel(<span
class
=
"hljs-keyword"
>
true
);
builder.setSmallIcon(R.drawable.common_icon_lamp_light_red);
builder.setDefaults(Notification.DEFAULT_LIGHTS);
notification = builder.build();
Class miuiNotificationClass = Class.forName(<span
class
=
"hljs-string"
>
"android.app.MiuiNotification"
);
Object miuiNotification = miuiNotificationClass.newInstance();
Field field = miuiNotification.getClass().getDeclaredField(<span
class
=
"hljs-string"
>
"messageCount"
);
field.setAccessible(<span
class
=
"hljs-keyword"
>
true
);
field.set(miuiNotification, number);<span
class
=
"hljs-comment"
>
// 设置信息数
field = notification.getClass().getField(<span
class
=
"hljs-string"
>
"extraNotification"
);
field.setAccessible(<span
class
=
"hljs-keyword"
>
true
);
field.set(notification, miuiNotification);
Toast.makeText(<span
class
=
"hljs-keyword"
>
this
, <span
class
=
"hljs-string"
>
"Xiaomi=>isSendOk=>1"
, Toast.LENGTH_LONG).show();
}<span
class
=
"hljs-keyword"
>
catch
(Exception e) {
e.printStackTrace();
<span
class
=
"hljs-comment"
>
//miui 6之前的版本
isMiUIV6 = <span
class
=
"hljs-keyword"
>
false
;
Intent localIntent = <span
class
=
"hljs-keyword"
>
new
Intent(<span
class
=
"hljs-string"
>
"android.intent.action.APPLICATION_MESSAGE_UPDATE"
);
localIntent.putExtra(<span
class
=
"hljs-string"
>
"android.intent.extra.update_application_component_name"
,getPackageName() + <span
class
=
"hljs-string"
>
"/"
+ lancherActivityClassName );
localIntent.putExtra(<span
class
=
"hljs-string"
>
"android.intent.extra.update_application_message_text"
,number);
sendBroadcast(localIntent);
}
<span
class
=
"hljs-keyword"
>
finally
{
<span
class
=
"hljs-keyword"
>
if
(notification!=<span
class
=
"hljs-keyword"
>
null
&& isMiUIV6 )
{
<span
class
=
"hljs-comment"
>
//miui6以上版本需要使用通知发送
nm.notify(<span
class
=
"hljs-number"
>
101010
, notification);
}
}
}
<span
class
=
"hljs-function"
><span
class
=
"hljs-keyword"
>
private
<span
class
=
"hljs-keyword"
>
void
<span
class
=
"hljs-title"
>sendToSony<span
class
=
"hljs-params"
>(String number) {
<span
class
=
"hljs-keyword"
>
boolean
isShow = <span
class
=
"hljs-keyword"
>
true
;
<span
class
=
"hljs-keyword"
>
if
(<span
class
=
"hljs-string"
>
"0"
.equals(number)) {
isShow = <span
class
=
"hljs-keyword"
>
false
;
}
Intent localIntent = <span
class
=
"hljs-keyword"
>
new
Intent();
localIntent.putExtra(<span
class
=
"hljs-string"
>
"com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE"
,isShow);<span
class
=
"hljs-comment"
>
//是否显示
localIntent.setAction(<span
class
=
"hljs-string"
>
"com.sonyericsson.home.action.UPDATE_BADGE"
);
localIntent.putExtra(<span
class
=
"hljs-string"
>
"com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME"
,lancherActivityClassName );<span
class
=
"hljs-comment"
>
//启动页
localIntent.putExtra(<span
class
=
"hljs-string"
>
"com.sonyericsson.home.intent.extra.badge.MESSAGE"
, number);<span
class
=
"hljs-comment"
>
//数字
localIntent.putExtra(<span
class
=
"hljs-string"
>
"com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME"
,getPackageName());<span
class
=
"hljs-comment"
>
//包名
sendBroadcast(localIntent);
Toast.makeText(<span
class
=
"hljs-keyword"
>
this
, <span
class
=
"hljs-string"
>
"Sony,"
+ <span
class
=
"hljs-string"
>
"isSendOk"
, Toast.LENGTH_LONG).show();
}
<span
class
=
"hljs-function"
><span
class
=
"hljs-keyword"
>
private
<span
class
=
"hljs-keyword"
>
void
<span
class
=
"hljs-title"
>sendToSamsumg<span
class
=
"hljs-params"
>(String number)
{
Intent localIntent = <span
class
=
"hljs-keyword"
>
new
Intent(<span
class
=
"hljs-string"
>
"android.intent.action.BADGE_COUNT_UPDATE"
);
localIntent.putExtra(<span
class
=
"hljs-string"
>
"badge_count"
, number);<span
class
=
"hljs-comment"
>
//数字
localIntent.putExtra(<span
class
=
"hljs-string"
>
"badge_count_package_name"
, getPackageName());<span
class
=
"hljs-comment"
>
//包名
localIntent.putExtra(<span
class
=
"hljs-string"
>
"badge_count_class_name"
,lancherActivityClassName ); <span
class
=
"hljs-comment"
>
//启动页
sendBroadcast(localIntent);
Toast.makeText(<span
class
=
"hljs-keyword"
>
this
, <span
class
=
"hljs-string"
>
"Samsumg,"
+ <span
class
=
"hljs-string"
>
"isSendOk"
, Toast.LENGTH_LONG).show();
}
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
|
注意lancherActivityClassName 必须被配置为 启动页 android.intent.category.LAUNCHER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<code
class
=
"hljs xml"
> <span
class
=
"hljs-tag"
><<span
class
=
"hljs-name"
>activity
<span
class
=
"hljs-attr"
>android:name=<span
class
=
"hljs-string"
>
"com.sample.activites.Welcome"
<span
class
=
"hljs-attr"
>android:configChanges=<span
class
=
"hljs-string"
>
"locale|keyboard|screenSize"
<span
class
=
"hljs-attr"
>android:label=<span
class
=
"hljs-string"
>
"@string/app_name"
<span
class
=
"hljs-attr"
>android:screenOrientation=<span
class
=
"hljs-string"
>
"portrait"
>
<span
class
=
"hljs-tag"
><<span
class
=
"hljs-name"
>intent-filter>
<span
class
=
"hljs-tag"
><<span
class
=
"hljs-name"
>action <span
class
=
"hljs-attr"
>android:name=<span
class
=
"hljs-string"
>
"android.intent.action.MAIN"
/>
<span
class
=
"hljs-tag"
><<span
class
=
"hljs-name"
>category <span
class
=
"hljs-attr"
>android:name=<span
class
=
"hljs-string"
>
"android.intent.category.LAUNCHER"
/>
<span
class
=
"hljs-tag"
></<span
class
=
"hljs-name"
>intent-filter>
<span
class
=
"hljs-tag"
><<span
class
=
"hljs-name"
>intent-filter>
<span
class
=
"hljs-tag"
><<span
class
=
"hljs-name"
>action <span
class
=
"hljs-attr"
>android:name=<span
class
=
"hljs-string"
>
"android.intent.action.CREATE_SHORTCUT"
/>
<span
class
=
"hljs-tag"
></<span
class
=
"hljs-name"
>intent-filter>
<span
class
=
"hljs-tag"
></<span
class
=
"hljs-name"
>activity></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
|