背景
在做一个android电视盒子的launcher,其中有一个需求,就是点击图标然后弹出通知栏。
实现
经过查阅资料后,得知通知栏的处理跟一个叫StatusbarManager的类有关,但是该类并不是提供给开发者使用的,而是android系统自己用的,也就是说它并没有提供接口给开发者使用。在网上看到有人使用反射机制来实现,代码如下:
public void showNotification() { try { Object service = MainActivity.this.getSystemService("statusbar"); if (service != null) { Method expand = service.getClass().getMethod( "expand"); expand.invoke(service); } } catch (Exception e) { e.printStackTrace(); } }
但是直接将这段代码运行之后却发现会抛出异常,后来去查看StatusbarManager的源代码,发现这个类根本没有expand方法。但是有一个叫expandNotificationsPanel的方法可以实现这个效果。于是将代码修改了,如下:
public void showNotification() { try { /* *利用反射机制得到系统正在运行的StatusbarManager对象,再通过获取其方法来调用 *弹出的 */ Object service = MainActivity.this.getSystemService("statusbar"); if (service != null) { Method expand = service.getClass().getMethod( "expandNotificationsPanel"); expand.invoke(service); } } catch (Exception e) { e.printStackTrace(); } }
本以为这回该没错了,但是运行之后还是抛出异常,查看后原来是使用这个类是需要添加权限的。需要在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
大功告成!以下为运行效果图:
图 1 点击前
图 2 点击后
项目下载链接:http://download.csdn.net/detail/u010662742/8126165
时间: 2024-11-10 00:42:04