我想用代码来打开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、通知栏、消息中心)的更多相关文章

  1. netty实现消息中心(一)思路整理

    一.需求 需要实现直播间的以下功能: 群发消息(文本.图片.推荐商品) 点对点私发消息(文本.图片.推荐商品) 单个用户禁言 全体用户禁言 撤回消息 聊天记录持久化 二.技术实现 服务端消息中心采用n ...

  2. React Native之通知栏消息提示(ios)

    React Native之通知栏消息提示(ios) 一,需求分析与概述 详情请查看:React Native之通知栏消息提示(android) 二,极光推送注册与集成 2.1,注册 详情请查看:Rea ...

  3. React Native之通知栏消息提示(android)

    React Native之通知栏消息提示(android) 一,需求分析与概述 1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用 ...

  4. 基于 SOA 概念 RPC 框架 的 消息中心 云部署 设计 漫谈

    一.背景 假设有一个系统的最大并发量有2000TPS左右.同时该系统有闲时和忙时,希望可以随时进行拓展和削减服务能力,以节省服务器费用开销. 该系统能提供站内消息.短信.app消息.邮箱的一个消息系统 ...

  5. Qt-网易云音乐界面实现-7 消息中心实现,主要是QListWidget 自定义Item 和QTabwidget使用

    最近写的有点烦躁, 感觉内容真的很多!很多!很多. 目前真的想知道网易官方在出这款产品是,用了多少人和多长时间. 今天写的这个消息中心,有点糙,只是原理实现了没有完全复制过来,心里有团火,不想写了. ...

  6. android实现通知栏消息

    一.原理 消息推送有两种,一种是客户端定时直接到服务器搜索消息,如果发现有新的消息,就获取消息下来:另一种是服务器向客户端发送消息,也就是当有信息消息时,服务器端就会向客户端发送消息. 二.步骤(代码 ...

  7. 消息中心 - Laravel的Redis队列(一)

    前言 Laravel的队列可以用在轻量级的队列需求中.比如我们系统中的短信.邮件等功能,这些功能有一些普遍的特征,异步.重试.并发控制等.Laravel现在主要支持的队列服务有Null.Sync.Da ...

  8. 学习一下 SpringCloud (五)-- 配置中心 Config、消息总线 Bus、链路追踪 Sleuth、配置中心 Nacos

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  9. html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一

    一 什么是有限状态机        FSM (finite-state machine),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.他对于逻辑以及 ...

随机推荐

  1. T-SQL语句3

    一.删除表 1.drop table语句 drop table database_name,schema_name,table_name 2.删除数据表 drop table dbo.t_delete ...

  2. Struts2与Spring的Maven依赖冲突

    今天在用Maven集成Struts2+Spring+Hibernate时发现只要不在web模块中声明spring-web的依赖,就会报java.lang.NoClassDefFoundError: [ ...

  3. 9-2 The Tower of Babylon uva437 (DP)

    题意:有n种立方体 每种都有无穷多个 要求选一些立方体叠成一根尽量高的柱子  (可以自行选择哪条边为高 )使得每个立方体的底面都严格小于他下方的立方体 为DAG模型 在任何时候 只有顶面的尺寸会影响到 ...

  4. 001.Pip简介安装使用

    一 PIP简介 pip类似RedHat里面的yum,使用PIP安装软件非常便捷快速. 二 PIP下载安装 方式一: [root@localhost ~]# yum install -y epel-re ...

  5. SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30001ms.

    SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after ...

  6. js原型鏈與js繼承解析

    最近在網上看了諸多js原型鏈的解析,說得雲裡霧裡,不明所以.徹底了解後,決定出個博客記錄一下,一是方便後來人學習,二是方便日後複習. 首先,我們來看一下構造函數.原型.實例之間的關係圖: 所以,我們通 ...

  7. hdu 4562 dp ***

    题意:给出一个点p(X,Y)以及若干圆.从中选出尽可能多的圆满足:圆能且只能包含p或者原点中的一个(不能在圆上):圆之间不能相交或者相切. 链接:点我 用dp求满足条件包含一个点圆的最多数目,然后两个 ...

  8. bzoj 4036 集合幂级数

    集合幂级数其实就是一种集合到数的映射,并且我们针对集合的一些操作(or  xor and specil or )为这种映射定义运算.其中一些东西可以通过某些手段将其复杂度降低. orz vfk /** ...

  9. 使用filezilla server搭建FTP服务器

    参考文献 http://www.pc6.com/infoview/Article_51961_all.html 背景 需要在内网环境下搭建一个FTP服务器,查阅相关资料发现使用filezilla se ...

  10. Android 解压zip文件

    过了n多天后,当再次使用原先博客上写的那篇: Android 压缩解压zip文件 去做zip包的解压的时候,出现了原来没有发现的很多问题.首先是中文汉字问题,使用java的zip包不能很好的解决解压问 ...