【Android开发技巧】 - 如何获取应用Shortcut在Launcher坐标信息

来源:互联网 发布:php防止sql注入方法 编辑:程序博客网 时间:2024/06/05 10:00
本文章由Jack_Jia编写,转载请注明出处。  
文章链接:http://blog.csdn.net/jiazhijun/article/details/8878941

作者:Jack_Jia    邮箱: 309zhijun@163.com


      一、序言


             目前市面上好多的工具类软件都实现了一个很有意思的交互方式,当用户点击Launcher上应用快捷方式icon时,在Icon的位置上方启动一个小的窗口来显示应用处理过程,这种交互的好处是用户不需要离开Launcher即可完成相应操作。但是应用是如何得到快捷方式Icon在Launcher中坐标信息的呢?

             今天我们就通过逆向分析360优化大师来看看获取icon坐标信息的实现细节。


     二、分析过程


            360优化大师一键清理交互方式如下图所示:

            当用户点击Launcher中“一键清理”时,界面显示悬浮窗口并显示清理的过程动画和清理结果。该悬浮窗口显示位置能够根据Icon位置的变化而变化。


                                                   

当点击一键清理icon时,系统发生了什么事情呢?

我们通过adb shell logcat查看日志信息,可以清晰的看到当点击事件发生时,系统发生了什么。




通过log信息,我们可以看到,当点击一键清理icon时,系统启动了.shortcut.clear.CleanActivity组件。请注意启动参数 bnds=[[125,392][235,510]] 

接下来查看.shortcut.clear.CleanActivity组件代码:




.shortcut.clear.CleanActivity组件并没有做太多的事情,并调用了Intent.getSourceBounds()方法,并将方法结果传递给了CleanViewServiceEx服务。

Intent.getSourceBounds()方法似乎就是一键清理icon的坐标信息。


接下来继续查看CleanViewServiceEx服务组件代码:




CleanViewServiceEx组件计算出了悬浮窗口在屏幕中的显示区域,并在该区域显示视图。


其实通过查看Android系统源代码Launcher.java 我们就可以获取真相,当shortcut被点击时,Launcher会通过setSourceBounds方法设置图标的坐标信息并通过Intent发送出去:




 三、结论


       通过Intent.getSourceBounds()方法可以获取到Shortcut在Launcher中的坐标信息。

原创粉丝点击