【问题标题】:Why can't I find a reference to the StatusBarManager class directly?为什么我不能直接找到对 StatusBarManager 类的引用?
【发布时间】:2012-07-04 06:37:25
【问题描述】:

要在Android中动态下拉通知区域,唯一的办法就是这样

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

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

【问题讨论】:

    标签: android statusbar


    【解决方案1】:

    为什么反射会让人讨厌?

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      对于那些希望在他们的系统应用程序中直接使用这个 API 的人(比如我),有一种无需反射即可访问的方法。

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

      LOCAL_CERTIFICATE := platform
      LOCAL_PRIVILEGED_MODULE := true
      

      【讨论】:

        猜你喜欢
        • 2016-11-06
        • 2012-01-08
        • 2014-11-25
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        相关资源
        最近更新 更多