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

问题描述

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

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

解决方案

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属性

解决方案二:

Android下获取状态栏的高度

Android平台中获取状态栏的高度代码实现

[java] view plaincopy

/**
 *
 * @param activity
 * @return > 0 success; <= 0 fail
 */
public int getStatusHeight(Activity activity){
    int statusHeight = 0;
    Rect localRect = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
    statusHeight = localRect.top;
    if (0 == statusHeight){
        Class<?> localClass;
        try {
            localClass = Class.forName("com.android.internal.R$dimen");
            Object localObject = localClass.newInstance();
            int i5 = Integer.parseInt(localClass.getField("status_bar_height").get(localObject).toString());
            statusHeight = activity.getResources().getDimensionPixelSize(i5);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
    return statusHeight;
}

解决方案三:

@Haydroid 谢谢你的回答 ,可能我表述的不够清楚,是这样的,我现在是打算获得通知栏是否已经下拉的状态,当它下拉的时候,我要让它收回,当它收回的时候,我点击Button想让它出现,所以关键是如何获得它出现与否的状态值。

解决方案四:

安卓正上方的类似来电通知,信息通知等广播通知是系统自动做好现实在上方的,你点击查看信息这些功能全是系统内置好的,只有你点击那些信息框之后出现一个菜单是程序员自己定义的,你想去转到打电话那个activity这些是程序员做的。 你如果说的是正上方那个通知框的话要去看android内置的那个类的方法!我也不知道叫什么,你上网查一下能不能查到!

解决方案五:

getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);///取得整个视图部分,注意,如果你要设置标题样式,这个必须出现在标题样式之后,否则会出错
int top = rect.top;////状态栏的高度,所以rect.height,rect.width分别是系统的高度的宽度
View v = getWindow().findViewById(Window.ID_ANDROID_CONTENT);///获得根视图
int top2 = v.getTop();///状态栏标题栏的总高度,所以标题栏的高度为top2-top
int width = v.getWidth();///视图的宽度,这个宽度好像总是最大的那个
int height = v.getHeight();////视图的高度,不包括状态栏和标题栏
如果只想取得屏幕大小,可以用
Display display = getWindowManager().getDefaultDisplay() ;

时间: 2024-11-02 16:25:57

通知栏状态-请问,谁知道怎么获得android状态栏的状态的相关文章

android中,请问谁知道怎样将视屏画面旋转180度之后播放?

问题描述 android中,请问谁知道怎样将视屏画面旋转180度之后播放? 不关横竖屏的事,各位大神,谁知道啊,急需啊.......................... 解决方案 试试看setOrientaionHint(180); 解决方案二: android中视频的操作中有个setOrientaionHint(180);//视频旋转180就可以了: 如果对您有帮助,请采纳

android 状态栏(StatusBar)

一.SystemUI 概述         自 android2.2 开始 , 原本存在与 framework-res.apk 中的状态栏和下拉通知栏界面控制被分割出一个单独的 apk文件 , 命名为 SystemUI.apk, 保存在 System/app 文件夹中.在 SystemUI.apk 中 , 是存在着状态栏的图标 ,XML 和控制文件等 , 这样的分割 , 使我们可以更方便地去修改. SystemUI 模块中主要包含了 USB 和 Statusbar 两个子模块,本文将以 Stat

Android 判断网络状态

 Android 判断网络状态这一应用技巧在实际应中是比较重要的.那么,在Android操作系统中,如何能够正确的判断我们所连接的网络是否断开恩?今天我们就针对这一应用技巧进行一个详细的分析. public class ConnectionChangeReceiver extends  BroadcastReceiver  {  @Override  public void onReceive( Context context, Intent intent )  {  ConnectivityM

网络-请问谁知道 Van Jacobson TCP/IP包头压缩 相关的知识和具体报文格式?

问题描述 请问谁知道 Van Jacobson TCP/IP包头压缩 相关的知识和具体报文格式? 新人一个,没有什么分:Van Jacobson TCP/IP包头压缩降低了TCP/IP包头的大小到接近3个字节,这对于慢速的串行线路来说是一大提高.IP压缩协议配置选项用于指示接收压缩包的能力.如果需要两个方向都进行压缩则需要双方独立申请. 4.1.PPP协议域值 在传送IP包时PPP协议域被设置为以下值: 0021 类型IP.IP协议不是TCP,或包是一个数据段,或未经过压缩. 002d 压缩的T

android按钮-关于设置Android Button按钮状态(normal,focused,pressed)图片,有没有简便的方法

问题描述 关于设置Android Button按钮状态(normal,focused,pressed)图片,有没有简便的方法 Android Button按钮状态(normal,focused,pressed)的图片 大都用drawable "selector" 来实现 类似 btn_background.xml <?xml version="1.0" encoding="UTF-8"?> <selector xmlns:and

系统中实时监听android的网络状态并且给予处理

问题描述 系统中实时监听android的网络状态并且给予处理 比如 在一个android小程序中 发现网络断了就给予页面跳转 解决方案 分几个步骤 1.监测手机上的网络连接状态 2.及时连接网络不一定可达,尝试连接服务器,如果通,则网路通. 解决方案二: 周期性检测网络连接>. 解决方案三: /** * 网络请求失败处理 */ public void requestNetDataFail(ErrorInfo errorInfo) { switch (errorInfo.errorCode) {

屏幕状态-android 锁屏状态下唤醒一个activity 无法让屏幕常亮

问题描述 android 锁屏状态下唤醒一个activity 无法让屏幕常亮 最近在做一个闹钟应用,系统收到闹钟的广播后,启动一个activity.关于锁屏状态和让屏幕常亮这一块出现了一些困惑,想请教各位前辈.先贴上图片 代码中设置了锁屏状态下可唤醒屏幕,并使屏幕常亮. 而测试的时候出现这样一个问题:如果当前手机并没有处于锁屏状态,此时activity被启动了,屏幕会保持常亮,(activity销毁,屏幕过了待机时间也会锁屏)这没有问题:但如果手机处于锁屏状态,广播收到了,也确实能唤醒屏幕,可是

socket网络编程-android的联网状态监测

问题描述 android的联网状态监测 你好:我想问问,怎样才能实时显示android手机与服务器连接状态的监测?我用了线程和定时器,都达不到想要的效果!有时可以,有时却不准确!为什么呢?? 解决方案 是手机的网速太慢了,或者有时候信号不好,中间发的数据没有接收完全,你可以减小手机和服务器之间发送的数据量,毕竟只是检测连接状态,发传送一个数字就可以了.而且检测的频率低一些,大概5秒左右检测一次就好了吧.这样情况应该会好一些 解决方案二: 采用TCP Socket通信,然后加上一个心跳.定时去请求

Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

原文:[置顶] Android菜鸟的成长笔记(14)-- Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话来了,当接完电话游戏继续玩),某些应用甚至会保留你离开时候的状态及数据,这些原理是什么?怎么去实现这样的应用?这将是我们这一篇文章要解开的问题. 有一句很常见的代码如下,很多人不知道为什么要加这么一句话 @Override protected void onCreate(Bundle savedIn