前几天看到小米手机的长截屏功能,几天下来有了如下思路。
1. 找到到目标Activity实例
2. 控制目标Activity实例滑动截屏
3. 传递截屏数据到当前进程
A)首先如何找到目标Activity实例。
先看下图:
对于每个Activity实例,其所在的进程有唯一的ActivityThread实例(PS:其main方法其实是应用入口)。ActivityThread中有ApplicationThread用于进程间通信。每个Activity实例在当前进程用ActivityClientRecord保存状态。
而AMS(即ActivityManagerService)所在的SS(即SystemServer)进程中,有对应的ProcessRecord实例对应,其内部变量IApplicationThread thread用于跟应用进程通信,Activity实例在SS的描述为ActivityRecord。
从上面描述可知,可以先从AMS获取对应的ActivityRecord(),然后找到ProcessRecord,通过其内部变量IApplicationThread thread跟目标进程的ActivityThread通信,为了方便可以通过AMS将IApplicationThread 传递过来。
修改如下: