Android 反射调用方法并利用此方法展开android通知栏
2014-08-19 18:01
676 查看
转自:http://blog.csdn.net/beiminglei/article/details/8909513
前段时间由于项目需要实现了展开通知栏的功能,所谓展开通知栏,就是通过expand statusbar的方式将所有通知显示出来,也就是手势由顶部下滑展开的界面,statusbar属于全局且系统级别的界面,API中并没有开放独立的接口供我们调用以完成通知栏的展开,所以这里需要用到反射,通过反射调用方法,使用的方法是invoke(),这个方法是Method的方法,可能大家不太理解,我对这部分也知之甚少,用我自己最粗浅的理解就是,通过方法名创建Method对象,通过该对象的invoke()方法反射出方法(这一步其实就是方法的执行),供我们调用,这样说起来很苍白,先上一段代码解释下吧。
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
然后,通过StatusBarManager的包名反射得到statusbarManager对象,再通过expand方法名得到Method这个类的对象expand,下面执行该方法,expand.invoke().这样便能实现展开通知栏,这个方法在android4.2以下版本中测试良好,可是近来发现4.2及以上版本中这个方法失效了,4.2中对通知栏做了改变,由两部分组成,一个是我们通常意义上的通知栏,如下图
仔细看右上角有个头像按钮,点击这个,通知栏便会翻转至另外一个界面,同样是通过通知栏的形式展示的,如下图
这便进入了快速设置的功能,这对于用户来说是非常方便的,同样我们可以通过点击右上角的按钮返回上面通知栏的界面。这点改进对用户来说十分方便,但是开发者就遇到了问题,常用的展开方法失效了,我查了官网也没看到相关的API的更新,于是我上了神网stackoverflow,反编译了别的APK,最后终于被我试出来了,现在把代码给大家贴一下。
就是在上面代码的基础上做了点改进,很一目了然,不做多的解释了。要说声抱歉,第一次发的文章格式很有问题,现在已经改正了。
demo下载地址http://download.csdn.net/user/beiminglei。
前段时间由于项目需要实现了展开通知栏的功能,所谓展开通知栏,就是通过expand statusbar的方式将所有通知显示出来,也就是手势由顶部下滑展开的界面,statusbar属于全局且系统级别的界面,API中并没有开放独立的接口供我们调用以完成通知栏的展开,所以这里需要用到反射,通过反射调用方法,使用的方法是invoke(),这个方法是Method的方法,可能大家不太理解,我对这部分也知之甚少,用我自己最粗浅的理解就是,通过方法名创建Method对象,通过该对象的invoke()方法反射出方法(这一步其实就是方法的执行),供我们调用,这样说起来很苍白,先上一段代码解释下吧。
public class Test { public static void main(String args[]){ A a = new A; Class class = A.getClass(); Method m1 = class.getDeclaredMethod("outInfo"); Method m2 = clazz.getDeclaredMethod("setMsg", String.class); Method m3 = clazz.getDeclaredMethod("getMsg"); m1.invoke(a); m2.invoke(a, "重新设置msg信息!"); String msg = (String) m3.invoke(a); System.out.println(msg); } } class A { private String msg; public A(String msg) { this.msg = msg; } public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void outInfo() { System.out.println("这是测试Java反射的测试类"); } }这里用到的是最简单的反射调用方法的实现,更深入的反射的使用还需要我们继续深入的学习,下面就是解决android展开通知栏的问题,先上代码再粗浅的解释下。
<span style="font-family: Arial; background-color: rgb(255, 255, 255);">首先我们需要获得系统服务,前面说过,</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">statusbar</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">是全局且系统级别的布局,然而对其实现展开还需要增加一项权限,这个不能忽略</span>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
然后,通过StatusBarManager的包名反射得到statusbarManager对象,再通过expand方法名得到Method这个类的对象expand,下面执行该方法,expand.invoke().这样便能实现展开通知栏,这个方法在android4.2以下版本中测试良好,可是近来发现4.2及以上版本中这个方法失效了,4.2中对通知栏做了改变,由两部分组成,一个是我们通常意义上的通知栏,如下图
仔细看右上角有个头像按钮,点击这个,通知栏便会翻转至另外一个界面,同样是通过通知栏的形式展示的,如下图
这便进入了快速设置的功能,这对于用户来说是非常方便的,同样我们可以通过点击右上角的按钮返回上面通知栏的界面。这点改进对用户来说十分方便,但是开发者就遇到了问题,常用的展开方法失效了,我查了官网也没看到相关的API的更新,于是我上了神网stackoverflow,反编译了别的APK,最后终于被我试出来了,现在把代码给大家贴一下。
public void OpenNotify() { // TODO Auto-generated method stub try { Object service = getSystemService("statusbar"); Class<?> statusbarManager = Class .forName("android.app.StatusBarManager"); Method expand = null; if (service != null) { expand = statusbarManager.getMethod("expand"); expand.setAccessible(true); expand.invoke(service); } } catch (Exception e) { } }
public void OpenNotify() { // TODO Auto-generated method stub int currentApiVersion = android.os.Build.VERSION.SDK_INT; try { Object service = getSystemService("statusbar"); Class<?> statusbarManager = Class .forName("android.app.StatusBarManager"); Method expand = null; if (service != null) { if (currentApiVersion <= 16) { expand = statusbarManager.getMethod("expand"); } else { expand = statusbarManager .getMethod("expandNotificationsPanel"); } expand.setAccessible(true); expand.invoke(service); } } catch (Exception e) { } }
就是在上面代码的基础上做了点改进,很一目了然,不做多的解释了。要说声抱歉,第一次发的文章格式很有问题,现在已经改正了。
demo下载地址http://download.csdn.net/user/beiminglei。
相关文章推荐
- Android 反射调用方法并利用此方法展开android通知栏(兼容4.2及以上)
- Android 反射调用方法并利用此方法展开android通知栏(兼容4.2及以上)
- 利用java反射解决 Android系统方法不能调用的情况
- 【Android开发经验】利用反射机制,获取类的字段、方法、并实现简单调用
- 利用虚拟方法和反射简化Alisoft API的调用
- java利用反射来调用一个类的私有方法
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- 利用.net反射动态调用指定程序集的中的方法
- 利用反射机制,读取dll,并调用其中的方法
- 在工厂模式里面利用反射机制动态调用对象方法
- 利用反射对私有属性/方法进行设置/调用
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
- 利用反射机制动态调用方法
- C# 如何利用反射来加载程序集,并调用程序集中有关类的方法
- 利用反射机制动态调用方法
- 利用反射来动态创建实例和调用方法(上)
- 利用反射调用用户控件方法
- ASP.Net 利用反射调用页面方法
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据