长截屏原理
前幾天看到小米手機(jī)的長(zhǎng)截屏功能,幾天下來(lái)有了如下思路。 
 1. 找到到目標(biāo)Activity實(shí)例 
 2. 控制目標(biāo)Activity實(shí)例滑動(dòng)截屏 
 3. 傳遞截屏數(shù)據(jù)到當(dāng)前進(jìn)程
A)首先如何找到目標(biāo)Activity實(shí)例。 
 先看下圖: 
 
對(duì)于每個(gè)Activity實(shí)例,其所在的進(jìn)程有唯一的ActivityThread實(shí)例(PS:其main方法其實(shí)是應(yīng)用入口)。ActivityThread中有ApplicationThread用于進(jìn)程間通信。每個(gè)Activity實(shí)例在當(dāng)前進(jìn)程用ActivityClientRecord保存狀態(tài)。 
 而AMS(即ActivityManagerService)所在的SS(即SystemServer)進(jìn)程中,有對(duì)應(yīng)的ProcessRecord實(shí)例對(duì)應(yīng),其內(nèi)部變量IApplicationThread thread用于跟應(yīng)用進(jìn)程通信,Activity實(shí)例在SS的描述為ActivityRecord。
從上面描述可知,可以先從AMS獲取對(duì)應(yīng)的ActivityRecord(),然后找到ProcessRecord,通過(guò)其內(nèi)部變量IApplicationThread thread跟目標(biāo)進(jìn)程的ActivityThread通信,為了方便可以通過(guò)AMS將IApplicationThread 傳遞過(guò)來(lái)。
修改如下: 
 1. 在ActivityManagerService繼承的接口IActivityManager中添加新方法,用于獲取目標(biāo)Activity的IApplicationThread 
B)接下來(lái)是控制目標(biāo)Activity實(shí)例滑動(dòng)截屏 
 修改如下: 
 1. 在IApplicationThread 中添加方法,用于控制Activity滑動(dòng) 
 2. 當(dāng)滑動(dòng)滿(mǎn)一屏或者截止時(shí)drawbitmap
C)最后是傳遞圖片到當(dāng)前進(jìn)程 
 考慮用binder傳送,但是一次傳送可能過(guò)大,可分多次傳送。
D)以上兩個(gè)修改了IActivityManager和IApplicationThread 。為了接口簡(jiǎn)單考慮,可改為添加兩個(gè)新的IXXX。
以下兩個(gè)位置是相關(guān)修改位置: 
 ActivityManagerService中的setSystemProcess 
 
ActivityThread中的attach方法用傳遞IApplicationThread 到SS進(jìn)程。 
 
總結(jié)
 
                            
                        - 上一篇: 微信小程序复制到剪切板及换行问题
- 下一篇: 配置数据源
