6.5 Android硬件访问服务使用反射
1、前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发现里面有classes.dex和classes2.dex这两个优化后的包)
因此这里修改编译选项:
在Android studio中
file->Project Structure->点击左边我们的app->点击右边的Dependencies,找到下面的classes,其Scope列表中的值改为Provided
2、app应用程序如何使用反射来访问硬件服务,已之前写的app为例
A、去掉import android.os.ILedService和import android.os.ServiceManager,同时新增import android.os.IBinder
B、在类中新增变量:Object proxy ;Method lec_ctrl
C、去掉iLedService =ILedService.stub.asInterface(ServiceManager.getService("led")); 并使用反射来实现该功能:
Method getService = Class.forName("android.os.ServiceManager").getMethod("getService",String.class)//getService的第一个参数是获得的方法名字
Object ledService = getService.invoke(null,"led")//第一个参数应该是实例化对象,但是getService方法是static的,所有不用实例化对象,‘led’就是getService的参数,invoke虽然是调用ledService函数,这个函数返回IBinder对象,但invoke返回的是Object,这个IBinder会向上转化为Object
//IBinder ledService = (IBinder)getService.invoke(null,"led");//功能同上面一句
/*到这里为止已经实现了ServiceManager.getService("led")的功能*/
Method asInterface= Class.forName("android.os.ILedService$Stub").getMethod("asInterface",IBinder.class);//这里的“$”表示子类
proxy = asInterface.invoke(null,ledService );//asInterface方法返回的是个Proxy对象,代码里面没有声明,所有这里使用父类Object来接收,
/*这里为止我们实现了iLedService =ILedService.stub.asInterface(ServiceManager.getService("led"));功能*/
/*下面我们来获得类Proxy里面的led_ctrl函数*/
lec_ctrl= Class.forName("android.os.ILedService$Stub$Proxy").getMethod("led_ctrl",int.class,int.class);
/*使用led_ctrl来点灯*/
lec_ctrl.invoke(proxy ,0,1);
接着我们就可以在app中使用Proxy类型对象proxy里面的led_ctrl来操作led了//Proxy类在ILedService.java中实现1
D、修改catch异常,去掉以前添加的try...catch...代码,在选中代码后,ctrl+alt+T,选择try catch
在android studio中的log界面也可以设置过滤器,设置Tag为LedHal
最新文章
- Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM
- unity对话代码
- 把cmd信息中的正常和异常输出分别输出到不同txt文件中
- Java面试题系列 提高Java I/O 性能
- sudo gem install cocoapods 没反应问题
- [MetaHook] R_SparkStreaks
- 一个不安装Oracle客户端的方法------未经试验
- Getting Started with the C# Driver
- MyBatis的动态SQL操作--更新
- 关于echarts绘图,主题的更换
- Java设计模式(四) 装饰 代理模式
- Swift 4 Hex Color
- vue层级关系的数据管理
- HTTPS数据传输过程简介
- NodeJs递归删除非空文件夹
- Mysql分析优化查询的方式
- MarkdownPad编写博客技巧笔记
- gulp的使用 文档
- SDN openflow 学习小得
- window下pip install Scrapy报错解决方案
热门文章
- 分享一下10个常用jquery片段
- 【Uva 1543】Telescope
- unity3d编程日志
- eclipse-ubuntu14.04图标替换不掉的问题
- thinkphp5 left join
- c#的中英文混合字符串截取 public static string SubString(string inputString, int byteLength)
- BZOJ3238: [Ahoi2013]差异(后缀数组)
- ThinkPHP5.0---静态方法
- 【Codeforces Round #452 (Div. 2) B】Months and Years
- django 简单会议室预约(1)