林莉芸 曾雪松
(信阳职业技术学院 数学与计算机科学学院,河南 信阳 464000)
Android中基于回调接口的确权机制
林莉芸曾雪松
(信阳职业技术学院 数学与计算机科学学院,河南 信阳 464000)
对Android系统中的回调接口的确权机制做简要介绍,对基于回调接口的确权机制做深入讨论,最后结合实际情况,给出Android应用的开发流程图。
Android;回调;接口;确权
不管是桌面应用还是手机应用程序,面对最多的就是用户,经常需要处理的就是用户动作,也就是需要为用户的动作提供响应。这种为用户动作提供响应的机制就是确权机制。随着移动互联网的飞速发展,手机应用越来越丰富,在应用安装运行的同时,它们就拥有了一些搜集手机数据的权限,在丰富我们生活的同时,个人的隐私也随之有可能遭到泄露。在不知不觉中,大量的应用都在截取着我们在互联网上的消费信息和消费习惯。那么如何避免个人的过多信息遭到泄露呢?从Android 4.4开始引入了权限管理机制。
所谓权限管理,就是能够手动配置某个App的权限,进而阻止恶意软件以及防止隐私泄漏。当然,更进一步的权限管理,是能够在App动态使用某个权限的时候,提供一直通知机制提示用户允许和拒绝。这样的权限管理就更加类似于Windows中的主动防御。
目前Android默认的权限管理方法是:检测应用操作权限请求,构造一个AlertDialog对象供用户选择。用户有三种选择:允许、拒绝和忽略。Android系统设备根据用户的选择来决定应用此次操作的权限:要么允许此次操作,要么阻止此次操作,要么忽略。这种弹框机制不但与OS 5.0系统风格不符,而且会造成多个AlertDialog堆积在一起,用户要一个个自上而下地确权,不能一目了然地看到系统当前所有的权限申请。
在实际实训项目实现上采用了基于回调接口的新的确权机制,用自定义的view代替了系统采用的AlertDialog,新机制能大大改善用户体验,符合OS 5.0风格。
回调就是当主程序需要的时候(或者到预定义状态值)调用的接口实现类。接口实际上是不能被直接调用的,我们能调用的一定不是接口或者抽象类。
回调接口的很多应用场景是出现在以接口类型为参数的情况下,以匿名内部类的方式传入而达到。
例如,假设有一个Java的API方法叫作(其中的ClickEvent就是一个接口)public void addEventListener(ClickEvent evt),那么,你在调用的时候就可以这样:
addEventListener(new ClickEvent(){
//在这里实现接口中的方法
});
当发生某事件时,API的addEventListener方法就会被组件调用,从而所完成的匿名内部类代码就会被组件执行。
例如,客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。像Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
当应用有权限请求时,权限管理服务会通过Binder调用到SystemUI中注册的回调接口,回调接口构造一个自定义的view对象并呈现给用户,用户确权后通过Binder将确权结果传给权限管理服务。权限管理服务进而将结果返回给申请权限的客户端,客户端根据确权结果继续以下的流程。
所有的权限请求以自定义的View显示,自定义View以List的形式通过状态栏弹出,能让用户一览无余,随意选择对哪个请求操作作出回应。而并非像在原生状态下机械地按顺序操作。
JAVA方法回调是功能定义和功能实现分享的一种手段,是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。
(1)定义接口 Callback,包含回调方法callback()
(2)在一个类Caller中声明一个Callback接口对象mCallback
(3)在程序中赋予 Caller对象的接口成员(mCallback) 一个内部类对象如
new Callback(){
callback(){
//函数的具体实现
}
}
这样,在需要的时候,可用Caller对象的mCallback接口成员调用callback()方法,完成回调。
例如,Android设备构造状态栏PhoneStatusBar时,实例化一个自定义的View对象PermissionsCheckPanelView,该对象代表着权限申请提示框。同时该View对象又是CheckPermissionCallback类的一个成员变量。
通过IOnCallbackAddRequest接口类将CheckPermissionCallback和AppOpsService连接起来,当有权限请求操作时,AppOpsService的askOperationLocked方法被调用,在askOperationLocked方法中调用IOnCallbackAddRequest接口中的onAddRequest方法。进而会调用到CheckPermissionCallback中的该方法,CheckPermissionCallback对该方法做了实现。实现的本质就是发送消息MSG_CTRLALL_PERMISSION_CHECK_PANEL,在该消息的处理中构造一个PermissionsCheckPanelView对象并显示出来。该对象代表着权限申请提示框。PermissionsCheckPanelView对象已实现OnTouchListener和OnItemClickListener接口,可以响应用户的选择操作。当用户作出选择或者等待15秒后,SystemUI会通过Binder调用AppOpsService的pushRequestChoice方法。在该方法中将用户的选择结果做处理,如用户选择记住时,需要将确权结果写进appops.xml文件。最后将确权结果通过Binder传回给申请权限的客户端,客户端根据结果继续下面的流程。以下是确权流程详细图示。
Android应用需要运行在手机上,手机与传统的计算机相比存储能力、计算能力有限,因此Android应用更适合作为客户端软件来使用。作为客户端应用程序,手机更能充分发挥它的携带方便的优势,可以随时随地开机运行程序,而且可以随时访问网络,通过网络与服务器交互。
[1]董晓刚.Android中基于回调机制的事件处理[J].中国电子商务,2013,(13).
[2]李杨.基于Android的多媒体应用开发与研究[J].计算机与现代化,2011,(4).
[3]韩超.基于Android经典应用开发[M].北京:人力资源出版社,2011.
[4]刘平.Android手机访问服务器的一种数据交互方法[J].电子设计工程,2010,(9).
责任编辑:柴造坡
10.3969/j.issn.1674-6341.2016.04.015
2016-03-31
林莉芸(1978—),女,河南驻马店人,硕士,讲师。研究方向:网络与多媒体技术、软件技术。
TP316
A
1674-6341(2016)04-0033-02