大大大v 2015-06-05 14:39 采纳率: 0%
浏览 3659
已结题

请问,谁知道怎么获得android状态栏的状态

现在开发中有一个需求就是做和ios的Assistive Touch 一样功能的app,现在通过反射可以让状态栏拉下来和滚上去了。但是有一个问题就是,怎么获得这个状态栏的状态呢?求大神们支招

  • 写回答

7条回答 默认 最新

  • Haydroid 2015-06-05 16:39
    关注

    Activity或者Service都能初始化一个状态栏通知。可因为Activity只有在活动状态并获得焦点时才能执行操作,所以还是建议用Service来创建状态栏通知。这样,即使用户正在使用其他程序或者设备已经休眠时,仍然可以从后台创建通知。要创建一个通知,须用到两个类:Notification类和NotificationManager类。

    用Notification类的一个实例来定义状态栏通知的属性,比如图标、展开信息,以及播放声音等附属设置。NotificationManager是一个Android系统服务,用于管理和运行所有通知。NotificationManager不能被实例化,为了把Notification传给它,你可以用getSystemService()方法获取一个NotificationManager的引用。在需要通知用户时再调用notify()方法将Notification对象传给它。

    要创建一个状态栏通知:

    1. 获取NotificationManager的引用:

    String ns = Context.NOTIFICATION_SERVICE;

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

    1. 实例化Notification:

    int icon = R.drawable.notification_icon;

    CharSequence tickerText = "Hello";

    long when = System.currentTimeMillis();

    Notification notification = new Notification(icon, tickerText, when);

    1. 指定通知的展开信息和Intent:

    Context context = getApplicationContext();

    CharSequence contentTitle = "My notification";

    CharSequence contentText = "Hello World!";

    Intent notificationIntent = new Intent(this, MyClass.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

    1. 将Notification对象传给NotificationManager:

    private static final int HELLO_ID = 1;

    mNotificationManager.notify(HELLO_ID, notification);

    好了,现在用户已经能看到通知了。

    管理通知

    系统服务NotificationManager管理着所有的通知,只能通过getSystemService()方法来获取它的引用。例如:

    String ns = Context.NOTIFICATION_SERVICE;

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

    如果想要发送状态栏通知,通过notify(int, Notification)传递Notification对象给NotificationManager即可。第一个参数是Notification 的唯一ID,第二个参数是Notification对象。ID在整个应用程序范围内唯一标识Notification。Notification需要更新;应用程序可能管理着多种不同的通知,在用户通过各自定义的Intent返回应用程序时必须能选择正确的动作执行之,因此上述参数是必需的。

    要实现用户从通知窗口内点选后自动清除状态栏通知,请在Notification对象中加入“FLAG_AUTO_CANCEL”标志。也可以传入通知ID用cancel(int)手动清除,或者用cancelAll()清除所有你创建的通知。

    创建通知

    Notification对象定义了通知消息显示在状态栏和通知窗口上的细节内容,以及其他提醒设置(比如:声音、闪光等)。

    状态栏通知必须包括以下内容:

    · 状态栏图标

    · 展开窗口view的标题和展开信息(除非用了自定义展开view)

    · PendingIntent,当通知被点选时执行

    状态栏通知的可选设置包括:

    · 状态栏提示信息

    · 提醒声音

    · 震动设置

    · LED灯闪光设置

    Notification的基础库(译者注:原文是starter-kit,但综合上下文并非“初学者套件”的意思,这里译为基础库)里包含了构造方法Notification(int, CharSequence, long)和setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent)方法。这已经可以定义Notification的所有设置。以下代码段演示了对通知基本的设置:

    int icon = R.drawable.notification_icon; // icon from resources

    CharSequence tickerText = "Hello"; // ticker-text

    long when = System.currentTimeMillis(); // notification time

    Context context = getApplicationContext(); // application Context

    CharSequence contentTitle = "My notification"; // expanded message title

    CharSequence contentText = "Hello World!"; // expanded message text

    Intent notificationIntent = new Intent(this, MyClass.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    // the next two lines initialize the Notification, using the configurations above

    Notification notification = new Notification(icon, tickerText, when);

    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

    更新通知

    应用程序可以在事件正在进行时更新状态栏通知。比如,前一条短信还未读,可又来了一条新短信,短信程序为了正确显示未读短信的总数,可以更新已有的通知。此时,更新原有通知要比向NotificationManager新增一条通知更合理些,因为避免了通知窗口的显示混乱。

    因为NotificationManager对每个通知都用一个整数ID进行了唯一标识,新的通知内容可以用setLatestEventInfo()方法方便地进行修改,然后再次调用notify()显示出来。

    除了Context、展开信息的标题和文本外,可以利用对象的成员值修改每个属性。要修改通知的文本信息,只能对contentTitle和contentText参数赋新值并调用setLatestEventInfo(),然后再调用notify()方法来更新通知。(当然,如果已经创建了自定义扩展view,那么标题和文本的修改就无效了)。

    添加声音

    可以用缺省提示音(由用户指定)或者程序指定声音来提醒用户。

    要使用用户缺省提示音,给defaults属性添加“DEFAULT_SOUND”:

    notification.defaults |= Notification.DEFAULT_SOUND;

    要使用应用程序指定的声音,则传递一个Uri引用给sound属性。以下例子使用已保存在设备SD卡上的音频文件作为提示音:

    notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");

    在下面的例子里,音频文件从内部MediaStore类的ContentProvider中获取:

    notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

    这时,已知有资源ID为6的媒体文件,并且已添加到Uri内容中。如果不知道确切的ID,则必须先用ContentResolver查询MediaStore中所有可用的资源。关于使用ContentResolver的详细信息请参阅Content Providers文档。

    如果期望在用户响应通知或取消通知前,声音一直持续循环播放,可以把 “FLAG_INSISTENT” 加入flags属性中。

    注意:如果defaults属性包含了“DEFAULT_SOUND”,则缺省提示音将覆盖sound 属性里指定的声音。

    添加振动

    可以用缺省震动模式或程序指定的振动模式来提醒用户。

    要用缺省震动模式,给属性defaults 添加“DEFAULT_VIBRATE” 即可:

    notification.defaults |= Notification.DEFAULT_VIBRATE;

    要自定义震动模式,须给vibrate属性传递一个long 类型的数组:

    long[] vibrate = {0,100,200,300};

    notification.vibrate = vibrate;

    长整型数组定义了震动开和关交替的时间(毫秒)。第一个数是开始振动前的等待时间(震动关闭),第二个数是第一次开启振动的持续时间,第三个数是下一次关闭时间,如此类推。振动模式的持续时间没有限制,但不能设置为重复振动。

    注意:如果defaults 属性包含了“DEFAULT_VIBRATE”,则缺省的震动模式将会覆盖vibrate 属性里指定的模式。

    添加闪光

    要想用LED闪光来提醒用户,可以执行缺省闪光模式(如果可用的话),也可以自定义闪光的颜色和模式。

    要使用缺省的闪光设置,给属性defaults 添加“DEFAULT_LIGHTS”即可:

    notification.defaults |= Notification.DEFAULT_LIGHTS;

    要自定义颜色和模式,则须指定ledARGB属性(指颜色)、ledOffMS属性(闪光关闭毫秒数)、ledOnMS属性(闪光开启毫秒数),并在“flags”属性里加入“FLAG_SHOW_LIGHTS”:

    notification.ledARGB = 0xff00ff00;

    notification.ledOnMS = 300;

    notification.ledOffMS = 1000;

    notification.flags |= Notification.FLAG_SHOW_LIGHTS;

    上例实现了绿色光闪烁300毫秒间歇1秒的闪光。每个设备的LED灯不可能支持所有颜色的发光,不同的设备所能支持的颜色也各不相同,因此硬件将按照最接近的颜色来发光。绿色是最常见的提醒色。

    其他特性

    利用Notification的属性和标志位,可以给通知添加更多的特性。

    下面列出了其中一些常用的特性:

    “FLAG_AUTO_CANCEL”标志

    在flags属性中增加此标志,则在通知窗口点选后能自动取消通知。

    “FLAG_INSISTENT”标志

    在flags属性中增加此标志,则在用户响应前一直循环播放声音。

    “FLAG_ONGOING_EVENT”标志

    在flags属性中增加此标志,则将通知放入通知窗口的“正在运行”(Ongoing)组中。表示应用程序正在运行——进程仍在后台运行,即使应用程序不可见(比如播放音乐或接听电话)。

    “FLAG_NO_CLEAR”标志

    在flags属性中增加此标志,表示通知不允许被“清除通知”按钮清除。这在期望通知保持运行时特别有用。

    number属性

    表示通知所代表的事件数量。此数字显示在状态栏图标上。要利用此属性,必须在第一次创建通知时设为1。(如果只是在更新通知时才把此值从0改成任意大于0的数,则数字不会显示出来。)

    iconLevel属性

    评论

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多