在休眠時喚醒設備,解鎖。而後執行拍照、撥打電話、下載數據,執行一個應用(浮點運算、gpu等),在執行20分鐘後將其關閉,而後進入休眠。shell
由於模擬的是用戶操做,因此並非在本身的應用中實現如上需求描述,而是調用當前系統的現有應用,模擬用戶交互。因此就在Activity的onCreate中,直接開啓了一個服務,由服務來進行控制,隨後將Activity finish()掉。瀏覽器
服務開始以後就進行狀態斷定,若是是鎖屏的狀況下,進行解鎖。inKeyguardRestrictedInputMode就能夠實現狀態斷定,若是是在鎖屏的狀況下,我就發送一個keyevent 26 \\power 間隔1s以後 keyevent 82 \\unlock. spa
隨後開啓使用startActivity開啓相機、撥號、瀏覽器(若是傳遞的網址是下載的文件,就能夠直接走瀏覽器的下載了)等。這裏注意intent要加上Intent.FLAG_ACTIVITY_NEW_TASK 。3d
最後設置了一下定時器,在必定時間以後再次啓動這個Activity,注意我這裏說的是「再次啓動Activity"而不是service,這裏是根據setRepeating中的參數決定的。其實也能夠啓動服務。code
1,event? getevent/sendevent? input keyevent? 事件
不打算分析事件機制、源碼解析。第一步就是拿着本身的手機adb shell getevent,能看到如/dev/input/event5: 0003 0002 000003bc相似的在滾動輸出,點兩下觸屏,和按鍵會發現event後面的都在發生變化,可是有必定規律,譬如在滑動觸屏的時候,始終是輸出的是event1(你的多是別的),如此一來咱們能夠肯定的是觸屏事件是event1,那麼是這樣麼,咱們再次輸入adb shell getevent -p來查看,找到even1的描述ip
add device 8: /dev/input/event1get
name: "goodix-ts" input
個人這個name仍是比較直白的 touch screen,因此還真是這樣。同時也能夠查看其餘的event都對應的是什麼設備,譬如我一直滾動的event5是accelerometer。源碼
至此,咱們再來分析一下後面的數據,以觸屏事件爲例:
adb shell getevent /dev/input/event1 (獲取當前觸屏事件)
獲得 0001 014a 00000001
0003 0035 00000173
0003 0036 000003d5
0003 0030 0000003b
這三列分別表明type、code、value,這列數據中就包含你觸摸位置的座標,0x35 是x軸、0x36是y軸。轉化爲10進制就變成了371,949。(當前個人0x35 max、 0x36 max值與我當前實際分辨率相等,因此沒有比例轉換的問題)
使用sendevent能夠模擬用戶完成一次點擊事件。例以下面就是一次完整的點擊返回。
shell@msm8916_32:/ $ sendevent /dev/input/event1 1 158 1
sendevent /dev/input/event1 1 158 1
shell@msm8916_32:/ $ sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 0 0
shell@msm8916_32:/ $ sendevent /dev/input/event1 1 158 0
sendevent /dev/input/event1 1 158 0
shell@msm8916_32:/ $ sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 0 0
上面的輸入太繁瑣,好在還有簡化點的。
input tap 200 300 //點擊200、300座標
input swipe 200 300 1200 300 //由200、300向 1200、300滑動
input keyevent 3 //home
input keyevent 4 //back
不一樣廠商的keyevent實際上可能有所不一樣,還請各位同窗去framework/native/include/input/KeycodeLables.h中去查看。
至此,咱們就能使用在adb shell中作滅屏,喚醒,點擊,滑屏...一系列動做。
----to be continued