用代码打开通知中心(statusbar、通知栏、消息中心)

我想用代码来打开android的消息中心,也叫做statusbar、通知栏。通知栏其实就是一个常驻的服务,至于原理这里就不多说了,简单说下思路和问题。

思路:API中没有实现的方法,那么就利用反射机制

问题:4.2系统中的方法变更

解决办法:分系统实现不同的方法

源码路径:……\sdk\sources\android-18\android\app\StatusBarManager

我们先来看android 4.4(API 19)中的方法,android 4.3(API 18),android 4.2.2(API 17)中都是下列方法

    /**
     * Expand the notifications panel.
     */
    public void expandNotificationsPanel() {
        try {
            final IStatusBarService svc = getService();
            if (svc != null) {
                svc.expandNotificationsPanel();
            }
        } catch (RemoteException ex) {
            // system process is dead anyway.
            throw new RuntimeException(ex);
        }
    }

    /**
     * Collapse the notifications and settings panels.
     */
    public void collapsePanels() {
        try {
            final IStatusBarService svc = getService();
            if (svc != null) {
                svc.collapsePanels();
            }
        } catch (RemoteException ex) {
            // system process is dead anyway.
            throw new RuntimeException(ex);
        }
    }

我们再来看android 4.1.2(API 16)中的方法,终于发现了方法名的不同了。

/**
     * Expand the status bar.
     */
    public void expand() {
        try {
            final IStatusBarService svc = getService();
            if (svc != null) {
                svc.expand();
            }
        } catch (RemoteException ex) {
            // system process is dead anyway.
            throw new RuntimeException(ex);
        }
    }

    /**
     * Collapse the status bar.
     */
    public void collapse() {
        try {
            final IStatusBarService svc = getService();
            if (svc != null) {
                svc.collapse();
            }
        } catch (RemoteException ex) {
            // system process is dead anyway.
            throw new RuntimeException(ex);
        }
    }

最后发现API 16自己包括之前的方法都是叫做expand(),collapse(),之后的方法就改名了。至于改名的原因也很清楚,就是4.2后状态栏中多了一个设置界面。所以要所写一个方法,由于expand(展开)这个方法名太笼统,所以就把拉开通知栏的方法叫做了expandNotificationsPanel,把拉开设置界面的方法叫做expandSettingsPanel。

下面是折叠/拉开设置界面的方法:

    /**
     * Collapse the notifications and settings panels.
     */
    public void collapsePanels() {
        try {
            final IStatusBarService svc = getService();
            if (svc != null) {
                svc.collapsePanels();
            }
        } catch (RemoteException ex) {
            // system process is dead anyway.
            throw new RuntimeException(ex);
        }
    }

    /**
     * Expand the settings panel.
     */
    public void expandSettingsPanel() {
        try {
            final IStatusBarService svc = getService();
            if (svc != null) {
                svc.expandSettingsPanel();
            }
        } catch (RemoteException ex) {
            // system process is dead anyway.
            throw new RuntimeException(ex);
        }
    }

好啦,找到问题后我们就需要用反射机制和判断系统版本的方式来写代码了。

/**
     * 显示消息中心
     */
    public static void openStatusBar(Context mContext){
        try {
               Object service = mContext.getSystemService ("statusbar");
               System.out.println("SDK INT= "+VERSION.SDK_INT
                       +" BUILD.VERSION.SDK"+Build.VERSION.SDK_INT);
               Class <?> statusBarManager = Class.forName("android.app.StatusBarManager");
               // 判断系统版本号
               String methodName = (VERSION.SDK_INT<=16)?"expand":"expandNotificationsPanel";
               Method expand = statusBarManager.getMethod (methodName);
               expand.invoke (service);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭消息中心
     */
    public static void closeStatusBar(Context mContext){
        try {
               Object service = mContext.getSystemService ("statusbar");
               Class <?> statusBarManager = Class.forName("android.app.StatusBarManager");
               // 判断系统版本号
               String methodName = (VERSION.SDK_INT<=16)?"collapse":"collapsePanels";
               Method expand = statusBarManager.getMethod(methodName);
               expand.invoke(service);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

整理后得到如下代码,方便大家调用(android 2.2及以上测试正常):

private static void doInStatusBar(Context mContext, String methodName) {
        try {
            Object service = mContext.getSystemService("statusbar");
            Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
            Method expand = statusBarManager.getMethod(methodName);
            expand.invoke(service);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 显示消息中心
     */
    public static void openStatusBar(Context mContext) {
        // 判断系统版本号
        String methodName = (VERSION.SDK_INT <= 16) ? "expand" : "expandNotificationsPanel";
        doInStatusBar(mContext, methodName);
    }

    /**
     * 关闭消息中心
     */
    public static void closeStatusBar(Context mContext) {
        // 判断系统版本号
        String methodName = (VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels";
        doInStatusBar(mContext, methodName);
    }

用代码打开通知中心(statusbar、通知栏、消息中心)

时间: 2024-10-14 15:47:52

用代码打开通知中心(statusbar、通知栏、消息中心)的相关文章

Android手机——读取手机电话+短信+网页+图片+音乐+视频+APK+通知栏消息+换头像

Android手机--电话+短信+网页+图片+音乐+视频+APK+通知栏消息+换头像 <!--拨打电话权限--> <uses-permission android:name="android.permission.CALL_PHONE"/> <!--连接网络权限--> <uses-permission android:name="android.permission.INTERNET"/> <!--读写文件的权限

android实现通知栏消息

一.原理 消息推送有两种,一种是客户端定时直接到服务器搜索消息,如果发现有新的消息,就获取消息下来:另一种是服务器向客户端发送消息,也就是当有信息消息时,服务器端就会向客户端发送消息. 二.步骤(代码) 注: Notification //是具体状态栏对象,设置Icon.文字.声音等.NotificationMangager //状态栏通知管理类.负责发消息.清理消息. import android.app.Notification;import android.app.Notification

通知栏消息(Notification)初步

   Notification是用来在通知中心中显示信息的,这里讲解了其最简单的使用方式. 关于PendingIntent和Intent的区别可以参考这篇文章:http://blog.csdn.net/zeng622peng/article/details/6180190 MainActivity.java package com.kale.notification; import android.app.Activity; import android.app.Notification; im

消息中心

- (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"第一页"; self.view.backgroundColor = [UIColor cyanColor]; [self createBtn]; second = [[SecondViewController alloc]init]; //添加消息的接收者--- 为消息中心添加观察者 //消息对整个工程都是可见 在整个工程的任意函数中都能接收

摇杆移动应用消息中心的简易实现

摇杆的实现原理 摇杆的组成是两个圆形 底图为大圆 大圆的半径是小圆的按压范围 以圆心为中心 模长为1 可看做坐标系 分为4个象限 根据按压点返回的Vector2值判断目标点在哪个象限 摇杆多用于手游 无法像键盘或鼠标输入具体位置 那么返回的Vector2值就用按压的力度*具体的模长来计算 目前完成了用户的输入 也就是得到了具体的偏移量 可以驱动所写的数据逻辑执行 经过逻辑的分发之后找到最后的执行逻辑 完成到目标点的移动 具体的执行逻辑可以应用消息中心 定义移动的枚举类型 首先添加事件 再写触发事

一个简单消息中心,实现回调的扁平化

function Msg(name, data) {         this.name = name;// 消息标识名称,不同的消息应该不同的名称         this.data = data;// 消息携带的数据,格式不限制     }     function Listener(keys, callback) {         if (typeof keys === "string") {             this.keys = keys.split('-');  

消息中心构架设计说明书

紫薇真人李万鸿 目录 1       1. 文档介绍.... 4 1.1       文档目的... 4 1.2       文档范围... 4 1.3       读者对象... 4 1.4       参考文献... 4 1.5       术语与缩写解释... 4 2       系统概述.... 5 3       设计约束.... 6 4       设计策略.... 7 5       系统总体结构.... 8 6       子系统N的结构与功能.... 9 7       开发环

iOS设计模式之NSNotificationCenter 消息中心

消息中心模式和KVO模式有点相似,区别在于,KVO  模式是意图在于监听摸一个对应的值的变化,而去出发一个方法相应的动作,而消息中心在于,广播,它就像一个广播基站,发送一条消息,在所有的添加监听的地方都能够收到此信息,并作出不同活着相同的动作,范围更广大,功能更强大 //添加消息中心监听(添加观察者,也能说成添加监听) [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(myNotification:)

一个Exchange 数据中心配置和数据中心切换操作实例

一.环境信息 主数据中心 服务器名称 IP地址 角色 备注 AD01 172.19.34.21 AD域控   Exchange2010 172.19.34.22 CAS+HUB+MAILBOX   Exchange2010-01 172.19.34.26 Mailbox   备用数据中心 服务器名称 IP地址 角色 备注 AD02 192.168.1.2 AD域控   Exchange2010-02 192.168.1.3 CAS+HUB+MAILBOX   Exchange2010-03 19