Blackberry - 如何在状态栏中使用通知图标

Posted

技术标签:

【中文标题】Blackberry - 如何在状态栏中使用通知图标【英文标题】:Blackberry - How to use notification icon in statusbar 【发布时间】:2010-11-30 17:10:50 【问题描述】:

在 RIM Blackberry OS 4.6+ 中有一个新功能 - 能够在状态栏中显示通知图标。集成应用程序使用它为用户提供快速和翔实的信息:经销商 - 未接来电,消息 - 未读消息等。

删除了无效的 ImageShack 链接

通知图标的可能用途:

错过的事件 RSS 更新 对象状态(例如天气/应用活动/gps 信号强度) 其他

我想发布此功能的操作指南。

【问题讨论】:

【参考方案1】:

ApplicationIndicator 类

要添加/修改/删除通知图标,我们可以使用ApplicationIndicator class:

表示由图标和可选数值组成的应用程序指示器。 该图标与新邮件计数器、日历提醒、未接电话计数器、安全状态等其他图标一起放置在指示器区域中。

应用程序只能注册一个指示灯,并且每次手机启动时都必须注册它。 手机重启后,所有指示灯都会被清除。 如果状态栏上没有空间,则指示器可能不可见 指标尺寸取决于当前主题和手机屏幕尺寸。 图标大小从 10x10 到 24x24 不等。 如果使用大图标初始化指示器,则会引发异常。 指标可以有可选的数值,通常用作计数器。 该值可以是负数、0 或正数。 如果指标用作计数器,最好在其值为 0 时隐藏它。 指标值太大会显示'99+'或'999+'

添加通知图标

为此我们应该创建ApplicationIcon的实例:

应用程序图标类与应用程序指示器和应用程序消息一起使用。 它封装了图像及其绘画属性。

EncodedImage mImage = EncodedImage.getEncodedImageResource("indicator_icon.png");
ApplicationIcon mIcon = new ApplicationIcon(mImage);

那么我们应该用ApplicationIndicatorRegistry注册ApplicationIndicator:

ApplicationIndicatorRegistry.register(icon, iconOnly, visible)icon - 一个图标显示在指示器区域iconOnly - 指定指示器是否应该仅具有图标表示并且没有值可见 - 指定指示器最初是否必须可见

ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
ApplicationIndicator indicator = reg.register(mIcon, false, true);

修改指标图标和数值

修改图标,使用ApplicationIndicator.setIcon方法:

ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
ApplicationIndicator appIndicator = reg.getApplicationIndicator();
appIndicator.setIcon(icon);

修改数值,使用ApplicationIndicator.setValue方法:

ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
ApplicationIndicator appIndicator = reg.getApplicationIndicator();
appIndicator.setValue(value);
如果提供的值非常大,则指示器将显示“99+”或“999+”。

要隐藏或显示指示器,请使用ApplicationIndicator.setVisible

注销 ApplicationIndicator

您很可能不希望您的应用指示器留在状态栏中,最好在应用关闭时ApplicationIndicatorRegistry.unregister() 它。

示例应用程序

图标:

删除了无效的 ImageShack 链接

截图:

删除了无效的 ImageShack 链接

代码:

import net.rim.blackberry.api.messagelist.ApplicationIcon;
import net.rim.blackberry.api.messagelist.ApplicationIndicator;
import net.rim.blackberry.api.messagelist.ApplicationIndicatorRegistry;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.container.MainScreen;

class Scr extends MainScreen 
    EncodedImage mImageGreen = EncodedImage
            .getEncodedImageResource("bb_icon_green.png");
    ApplicationIcon mIconGreen = new ApplicationIcon(mImageGreen);
    EncodedImage mImageRed = EncodedImage
            .getEncodedImageResource("bb_icon_red.png");
    ApplicationIcon mIconRed = new ApplicationIcon(mImageRed);

    ApplicationIcon mIcon = mIconGreen;

    public Scr() 
        add(new LabelField("Use menu to:"));
        add(new LabelField("Register indicator"));
        add(new LabelField("Increment value"));
        add(new LabelField("Decrement value"));
        add(new LabelField("Switch icon"));
        add(new LabelField("Unregister indicator"));
    

    MenuItem menuRegister = new MenuItem("register", 0, 0) 
        public void run() 
            registerIndicator();
        ;
    ;
    protected int mValue = 0;
    MenuItem menuIncrement = new MenuItem("increment", 0, 0) 
        public void run() 
            mValue++;
            updateValue(mValue);
        ;
    ;
    MenuItem menuDecrement = new MenuItem("decrement", 0, 0) 
        public void run() 
            mValue--;
            updateValue(mValue);
        ;
    ;
    MenuItem menuSwitchIcon = new MenuItem("icon", 0, 0) 
        public void run() 
            mIcon = (mIcon == mIconGreen) ? mIconRed : mIconGreen;
            updateIcon(mIcon);
        ;
    ;
    MenuItem menuUnregister = new MenuItem("unregister", 0, 0) 
        public void run() 
            unregisterIndicator();
        ;
    ;

    protected void makeMenu(Menu menu, int instance) 
        super.makeMenu(menu, instance);
        menu.add(menuRegister);
        menu.add(menuIncrement);
        menu.add(menuDecrement);
        menu.add(menuSwitchIcon);
        menu.add(menuUnregister);
    

    private void registerIndicator() 
        try 
            ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
                    .getInstance();
            ApplicationIndicator indicator = 
                    reg.register(mIcon, false, true);
         catch (Exception e) 
        
    

    private void unregisterIndicator() 
        try 
            ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
                    .getInstance();
            reg.unregister();
         catch (Exception e) 
        
    

    void updateValue(int value) 
        try 
            ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
                    .getInstance();
            ApplicationIndicator appIndicator = 
                    reg.getApplicationIndicator();
            appIndicator.setValue(value);
         catch (Exception e) 
        
    

    void updateIcon(ApplicationIcon icon) 
        try 
            ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
                    .getInstance();
            ApplicationIndicator appIndicator = 
                    reg.getApplicationIndicator();
            appIndicator.setIcon(icon);
         catch (Exception e) 
        
    

【讨论】:

以上是关于Blackberry - 如何在状态栏中使用通知图标的主要内容,如果未能解决你的问题,请参考以下文章

如何在状态栏中显示图标而不在通知抽屉中显示通知?

停止 OneSignal 通知以显示在状态栏中

FCM 推送通知在返回应用程序时打开,而不是在 iOS 的状态栏中显示

Android 在没有可展开视图的情况下在状态栏中显示通知

如何在多个通知单击时显示适当的消息

当第二个被触摸时,android的状态栏中出现多个推送通知其他人消失