Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

摘要 Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差。

BadgeNumber ShortCutNumber miui samsung sony sendBadgeNumber logo/icon数字提醒

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

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

 <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

在启动的Activity中、发送未读消息数目广播 和 重置/清除未读消息数目广播 的调用如下: 
// 发送未读消息数目广播:count为未读消息数目(int类型)

BadgeUtil.setBadgeCount(getApplicationContext(), count);

// 发送重置/清除未读消息数目广播:

BadgeUtil.resetBadgeCount(getApplicationContext());

资料参考: 
http://blog.csdn.net/andylao62/article/details/41794695 
http://blog.csdn.net/wx_962464/article/details/37997299 
https://github.com/ekinlyw/android-badge 
http://www.tuicool.com/articles/JV7vIr

————————————————————————————————————— 
如果文章内容对您有帮助, 可以帮 顶 一下,来支持一下哦! 
如果您对文章内容有任何疑问或有更好的见解, 欢迎通过留言或发邮件的方式联系我:  
[email protected]

如需要转载,请注明出处,谢谢!! 
—————————————————————————————————————

时间: 2024-10-14 19:53:49

Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒的相关文章

Android系统 小米/三星/索尼快键图标BadgeNumber数字提醒

Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差. 我们现在来实现桌面logo或者说icon右上角的图标,先来看2张图,第一张来自互联网,第二张来自个人实践!(由于实验条件youxia)     好了,上代码 public class Main

Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示

参考: http://dev.xiaomi.com/doc/p=3904/index.html http://my.oschina.net/ososchina/blog/352286?p=1#comments https://github.com/leolin310148/ShortcutBadger http://www.voidcn.com/blog/kongbaidepao/article/p-62251.html http://www.eoeandroid.com/thread-5572

在小米 三星 索尼 手机 :图标上显示数字

在小米 三星  索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的. 小米已经测试通过了, 三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码), 测试一下,可以在回复一下测试结果,谢谢 1.原生系统(原生的Launcher ),只能修改快捷方式,增加和删除都会有toast提示 2.小米 三星  索尼 手机: 自定义的launcher:  发送显示未读消息数的action已经不同了.具体可以去看代码... 判断手机的代码:

桌面图标未读消息(小米,sony,三星手机)

新消息来了,在桌面的Laucher图标上显示新消息数 /** * 应用桌面图标未读消息显示工具类 * 只支持 小米,三星和索尼 */ public class BadgeUtil { final static String LAUNCHER_ACTIVITY_NAME = "com.wenki.example.activity.SplashActivity"; public static void setBadgeCount(Context context, int count) {

Android系统在新进程中启动自定义服务过程(startService)的原理分析

在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务.在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的. 在主进程调用startService函数时,会通过Binder进程间通信机制来

realarm Android系统编译后内核无法启动的解决方法

由于之前版本使用的内核并非uImage格式,而在编译时使用的是非uImage格式编译,所以照成无法启动. 解决方法是,在编译内核时使用make uImage方式编译. 修改根目录下的build_realv210.sh文件,如下图所示 另外注意上图中CPU_JOB_NUM这个参数,要根据自己的电脑配置来选择,该参数在该文件的起始处设置,可以设置成电脑CPU核心数的2倍,例如:如果核心数为2,那么设置成4即可. 完整脚本下载地址:http://download.csdn.net/detail/u01

Android系统源码阅读(13):Input消息的分发过程

Android系统源码阅读(13):Input消息的分发过程 请对照AOSP版本:6.0.1_r50.学校电脑好渣,看源码时卡半天 先回顾一下前两篇文章.在设备没有事件输入的时候,InputReader和InputDispatcher都处于睡眠状态.当输入事件发生,InputReader首先被激活,然后发送读取消息,激活Dispatcher.Dispatcher被激活以后,将消息发送给当前激活窗口的主线程,然后睡眠等待主线程处理完这个事件.主线程被激活后,会处理相应的消息,处理完毕后反馈给Dis

【Python学习笔记】-APP图标显示未读消息数目

以小米手机系统为例,当安装的某个APP有未读消息时,就会在该APP图标的右上角显示未读消息的数目.本文主要解说怎样用Python语言实现图标显示未读消息的数目.首先,还是要用到Python中PIL库,关于Linux下怎样安装PIL库,请大家參考这篇博客:http://blog.csdn.net/kevin_zhai/article/details/47720721,里面有具体的安装过程.实现的原理非常easy,直接用Image读取原始图标.然后将未读消息的数目插入到图标的右上角就可以. 脚本代码

Android自定义控件:类QQ未读消息拖拽效果

QQ的未读消息,算是一个比较好玩的效果,趁着最近时间比较多,参考了网上的一些资料之后,本次实现一个仿照QQ未读消息的拖拽小红点,最终完成效果如下: 首先我们从最基本的原理开始分析,看一张图: 这个图该怎么绘制呢?实际上我们这里是先绘制两个圆,然后将两个圆的切点通过贝塞尔曲线连接起来就达到这个效果了.至于贝塞尔曲线的概念,这里就不多做解释了,百度一下就知道了. 切点怎么算呢,这里我们稍微复习一些初中的数学知识.看了这个图之后,求出四个切点应该是轻而易举了. 现在思路已经很清晰了,按照我们的思路,开