5

要在Android中动态下拉通知区域,唯一的解决方案是这个

    Object sbservice = getSystemService( "statusbar" );
    Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
    Method showsb = statusbarManager.getMethod( "expand" );
    showsb.invoke( sbservice );

这非常有效,但为什么反射会让人讨厌呢?为什么我不能直接找到对 StatusBarManager 类的引用?为什么“statusbar”服务的 Context 类中没有常量?

4

2 回答 2

14

为什么反射的肮脏?

因为它不是 Android SDK 的一部分。只有对创建不可靠的应用程序感兴趣的人才会尝试与StatusBarManagerAndroid 源代码本身的外部进行交互,因为核心 Android 团队和设备制造商可以随时更改 SDK 之外的任何内容。

为什么我不能直接找到对 StatusBarManager 类的引用?

因为它不是 Android SDK 的一部分。Android 框架类中有很多类和方法都被标注了@hide注解,原因有很多:不愿意无限期地支持 API,“默默无闻的安全性”等等。

为什么“statusbar”服务的 Context 类中没有常量?

因为它不是 Android SDK 的一部分。当然欢迎您向 AOSP 提供补丁,以使其StatusBarManager被“提升”到与其他系统服务相同的状态(例如LocationManagerNotificationManager)。如果这种StatusBarManager情况只是 SDK 在 2007 年左右创建后的疏忽,那么您的补丁很可能会被接受,并且您会在即将发布的 Android 版本中看到变化。

于 2012-07-04T11:09:55.577 回答
0

对于那些希望直接在他们的系统应用程序中使用这个 API 的人(比如我),有一种方法可以在没有反射的情况下获得访问权限。

将此添加到您的应用程序的Android.mk

LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
于 2018-10-05T22:41:29.713 回答