Android应用如何点击桌面图标
开启悬浮窗后跳转到上一个打开的应用
--ADB连接专 题
-
上一篇:Android手机无需授权就抓取屏幕画面-原理浅析和实现办法
下一篇:编写中。
-
一、前 言
【点广告app】的使用方式通常为:打开"汽水音乐"、"抖音极速版"等广告APP,准备去领金币了,突然发觉没有开启【点广告app的悬浮窗】。这个时候就要先Home返回手机桌面,找到【点广告app】的桌面图标并点击它,启动了点广告的悬浮窗。然后滑拨展开任务窗口列表,找到刚刚使用的汽水音乐点击切换,继续进行领金币的大业。
闲暇的时候,我们就在想:有没有办法像"小爱助手"那样,一句话就唤醒悬浮窗,浮动在当前活动的"汽水音乐"等应用之上?这样的话就不用做那么多繁琐和复杂的操作,就能快速的进入【ocr识别并自动点击广告】的交互中。理论上讲,小爱通话能做,我们肯定也能做。我们打算下一期就去盘它。
本期我们暂时不搞那么复杂,先把上述使用方式的步骤进行简化,使用户手动点击了桌面图标之后,能自动开启点广告悬浮窗后,自动跳转到最近打开的应用,方便用户继续领金币。
体验和下载地址:
智能拨号器App: http://120.78.211.195:8060/Dialer.apk
- 二、技术准备
首先,通常来说,一个Android应用触发事件跳转到另一个Android应用,一般手机都会弹框提示用户"是否允许"。若用户授权允许则会从包名中获取【
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
】默认主入口进行加载和显示。
这很明显不符合我们的需求,我们需要静默的操作,"悄悄的进村"。而且,它这个跳转会重新定位到新应用的主界面,我们原本浏览广告的Activity活动未必就是应用的主界面。浏览广告或新闻正爽呢,开了个悬浮窗,就重新恢复到了主界面,多冒昧啊。
因此,我们只能另辟蹊径,看看是否存在类似于【手机展示"任务窗口列表"并主动点击切换最近应用】这样的快捷操作入口。
- 三、安卓活动列表初探
我们之前已经通过手机tcp的5555端口,与手机的adbd建立了稳定的adb客户端连接。因此,我们可以尝试执行下述命令,来获取到Android手机当前所有的活动列表:
adb shell dumpsys activity activities
命令反馈的内容和展示效果,大致如下图所示:

从这个adb命令我们很容易知道:Android基本都支持【dumpsys activity activities】,并且在响应的文本反馈中,会按照任务堆栈的先后次序,以文本字符串的方式将【
任务类型:type=standard/home
是否最顶层任务:visible=true/false
任务当前Activity:com.dragon.read/.pages.main.MainFragmentActivity
】这些信息全部展示了出来。
我们在解析【dumpsys activity activities】反馈的内容信息中,就可以直接从上到下,直接匹配和选取第一个"type=standard"且存在"visible="字符串的Task,提取其【ActivityRecord{26549485 u0 com.dragon.read/.pages.main.MainFragmentActivity t5880}】中的内容来获取最顶层任务的包名和当前Activity界面的名称。
- 四、如何根据包名Activity名称打开应用
很简单,adb客户端命令中的【
adb shell am start -n com.dragon.read/.pages.main.MainFragmentActivity
】这个指令就是专门用来跳转到目标Activity界面的。
但是,某些应用APP的Activity会专门配置【android:exported="false"】使活动仅能应用自己操作,不允许外部途径进行访问。
此时,如继续执行上述的"am start -n xxx"指令,将会提示下述的错误:

此时,没有办法,我们只能寻找和更换另一个adb命令,如下:
【adb shell monkey -p com.ihuman.kaka -c android.intent.category.LAUNCHER 1】
这个命令只需要包名,即可正常的打开和恢复到任务的最近的Activity界面。
但"monkey -p xxx"指令有个弊端:它启动和执行的速度会比较慢,如果"am start -n xxx"指令只需600ms的话,"monkey -p xxx"指令大约需要3s-5s才能正常的切换Task应用。
- 五、最终使用的办法
因此,我们折中一下,使用【||】命令,把这两个指令联合在一起执行。通过使用诸如
【
adb shell am start -n com.ihuman.kaka/com.ihuman.code.MainActivity || adb shell monkey -p com.ihuman.kaka -c android.intent.category.LAUNCHER 1
】
等办法,来最终实现任务又快又准确的切换。当然,由于上述指令执行后总是会反馈成功或失败的消息,我们可以简单的增加"2>/dev/null"参数,使失败的adb指令不会将执行失败的消息打印输出反馈。
最终,我们进行手机顶层APP任务切换方式的指令为:
【
exec:(am start -n %s%s 2>/dev/null) || (monkey -p %s -c android.intent.category.LAUNCHER 1 2>/dev/null)
】
至此,我们使用"dumpsys activity activities"和"am start || monkey"的组合指令,联合实现了"用户手动点击了桌面图标之后,能自动开启点广告悬浮窗后自动跳转到最近打开的应用"的效果。
- 六、小结
本篇是纯技术文章,用于Android应用在后台静默的进行应用切换。一路走来,我们已经在Android的底层层面"静默"的做了很多的事情。所以说"手机开发者模式"还是很危险的。^V^。
本文的技术细节和实现方式,有动手能力和需求的读者,可以自行尝试和验证。
技术服务于生活,生活需要更多创意,也需要你和我们共同参与。