我想用代码来打开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)中都是下列方法

  1. /**
  2. * Expand the notifications panel.
  3. */
  4. public void expandNotificationsPanel() {
  5. try {
  6. final IStatusBarService svc = getService();
  7. if (svc != null) {
  8. svc.expandNotificationsPanel();
  9. }
  10. } catch (RemoteException ex) {
  11. // system process is dead anyway.
  12. throw new RuntimeException(ex);
  13. }
  14. }
  15.  
  16. /**
  17. * Collapse the notifications and settings panels.
  18. */
  19. public void collapsePanels() {
  20. try {
  21. final IStatusBarService svc = getService();
  22. if (svc != null) {
  23. svc.collapsePanels();
  24. }
  25. } catch (RemoteException ex) {
  26. // system process is dead anyway.
  27. throw new RuntimeException(ex);
  28. }
  29. }

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

  1. /**
  2. * Expand the status bar.
  3. */
  4. public void expand() {
  5. try {
  6. final IStatusBarService svc = getService();
  7. if (svc != null) {
  8. svc.expand();
  9. }
  10. } catch (RemoteException ex) {
  11. // system process is dead anyway.
  12. throw new RuntimeException(ex);
  13. }
  14. }
  15.  
  16. /**
  17. * Collapse the status bar.
  18. */
  19. public void collapse() {
  20. try {
  21. final IStatusBarService svc = getService();
  22. if (svc != null) {
  23. svc.collapse();
  24. }
  25. } catch (RemoteException ex) {
  26. // system process is dead anyway.
  27. throw new RuntimeException(ex);
  28. }
  29. }

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

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

  1. /**
  2. * Collapse the notifications and settings panels.
  3. */
  4. public void collapsePanels() {
  5. try {
  6. final IStatusBarService svc = getService();
  7. if (svc != null) {
  8. svc.collapsePanels();
  9. }
  10. } catch (RemoteException ex) {
  11. // system process is dead anyway.
  12. throw new RuntimeException(ex);
  13. }
  14. }
  15.  
  16. /**
  17. * Expand the settings panel.
  18. */
  19. public void expandSettingsPanel() {
  20. try {
  21. final IStatusBarService svc = getService();
  22. if (svc != null) {
  23. svc.expandSettingsPanel();
  24. }
  25. } catch (RemoteException ex) {
  26. // system process is dead anyway.
  27. throw new RuntimeException(ex);
  28. }
  29. }

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

  1. /**
  2. * 显示消息中心
  3. */
  4. public static void openStatusBar(Context mContext){
  5. try {
  6. Object service = mContext.getSystemService ("statusbar");
  7. System.out.println("SDK INT= "+VERSION.SDK_INT
  8. +" BUILD.VERSION.SDK"+Build.VERSION.SDK_INT);
  9. Class <?> statusBarManager = Class.forName("android.app.StatusBarManager");
  10. // 判断系统版本号
  11. String methodName = (VERSION.SDK_INT<=16)?"expand":"expandNotificationsPanel";
  12. Method expand = statusBarManager.getMethod (methodName);
  13. expand.invoke (service);
  14. }
  15. catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. /**
  21. * 关闭消息中心
  22. */
  23. public static void closeStatusBar(Context mContext){
  24. try {
  25. Object service = mContext.getSystemService ("statusbar");
  26. Class <?> statusBarManager = Class.forName("android.app.StatusBarManager");
  27. // 判断系统版本号
  28. String methodName = (VERSION.SDK_INT<=16)?"collapse":"collapsePanels";
  29. Method expand = statusBarManager.getMethod(methodName);
  30. expand.invoke(service);
  31. }
  32. catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }

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

  1. private static void doInStatusBar(Context mContext, String methodName) {
  2. try {
  3. Object service = mContext.getSystemService("statusbar");
  4. Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
  5. Method expand = statusBarManager.getMethod(methodName);
  6. expand.invoke(service);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. }
  11.  
  12. /**
  13. * 显示消息中心
  14. */
  15. public static void openStatusBar(Context mContext) {
  16. // 判断系统版本号
  17. String methodName = (VERSION.SDK_INT <= 16) ? "expand" : "expandNotificationsPanel";
  18. doInStatusBar(mContext, methodName);
  19. }
  20.  
  21. /**
  22. * 关闭消息中心
  23. */
  24. public static void closeStatusBar(Context mContext) {
  25. // 判断系统版本号
  26. String methodName = (VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels";
  27. doInStatusBar(mContext, methodName);
  28. }

用代码打开通知中心(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. 结合IdentityServer4配置Ocelot的Json配置文件管理更新

    Ocelot提供了AddAdministration方法来设置配置路由以及授权方式 services.AddOcelot().AddAdministration("/admin", ...

  2. 用ProFTPD构建FTP服务器

    配置 ProFTPD 然后,通过修改相应配置文件配置ProFTPD. [root@sample ~]# vi /etc/proftpd.conf ← 修改ProFTPD的配置文件 ServerType ...

  3. python 单变量线性回归

      单变量线性回归(Linear Regression with One Variable)¶ In [54]: #初始化工作 import random import numpy as np imp ...

  4. Windows下 ffmpeg + labelImg 提取视频帧 得到图片集 并 标注图片 来 构造数据集

    构造数据集的流程 视频文件  >>  ffmpeg处理  >>  图片集  >>  labelImg进行标注  >>  标注好的数据集 准备ffmpeg ...

  5. 016.Zabbix聚合监控

    一 Zabbix监控机汇总计算 用Calcuated Items可以对Items进行汇总计算,如求磁盘总容量.网络流量,只依赖于Zabbix-Server,与Zabbix-Agent和proxy无关. ...

  6. PC端meta标签

    下面介绍meta标签的几个属性,charset,content,http-equiv,name. 一.charset 此特性声明当前文档所使用的字符编码,但该声明可以被任何一个元素的lang特性的值覆 ...

  7. Beta冲刺准备

    过去存在的问题: 界面不够美观 推荐不够人性化 代码不够符合开闭原则 我们已经做了哪些调整/改进: 本来想引入springAndroid,但看了下google的官方文档,不建议引入第三方框架:代码重构 ...

  8. div光标

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. RabbitMQ简单使用

    环境搭建: RabitMQ是用Elang编写的,虽然Elang本身是跨平台的,但也同时意味着搭建Rabit环境需要首先配置Elang环境.配置RabitMQ的网上教程还比较多的: windows 下 ...

  10. 通过Windows Compatibility Pack补充.net core中缺失的api

    把项目往.net core上迁移的时候,一个最大的问题就是和.net framework相比,有一部分api缺失.它主要分为两类: Windows 独有的api,如注册表 未完成的功能,如System ...