最近工作中需要使用通知栏,在某些操作下需要收起通知栏。
查看源码发现statusbar的服务被标记为@hide
/**
* Use with {@link #getSystemService} to retrieve a {@link
* android.app.StatusBarManager} for interacting with the status bar.
*
* @see #getSystemService
* @see android.app.StatusBarManager
* @hide
*/
public static final String STATUS_BAR_SERVICE = "statusbar";
那么如何获得这个服务呢?
请看下面的方法
Class<?> serviceManagerClass;
serviceManagerClass = Class.forName("android.os.ServiceManager");
Method getService = serviceManagerClass.getMethod("getService", String.class);
IBinder retbinder = (IBinder) getService.invoke(serviceManagerClass, "statusbar");
Class<?> statusBarClass = Class.forName(retbinder.getInterfaceDescriptor());
Object statusBarObject = statusBarClass.getClasses()[0].getMethod("asInterface", IBinder.class).invoke(null, new Object[] { retbinder });
Method collapsePanels = statusBarClass.getMethod("collapsePanels");
collapsePanels.setAccessible(true);
collapsePanels.invoke(statusBarObject);
使用反射,一步一步得到了关闭通知栏的方法。
反射的语义就是method.invoke(classname, params); 调用classname类的method方法,方法的参数是params。