使用Shell命令

Android中自带一个input工具,使用方法如下

  1. 模拟按键操作
1
2
3
adb shell #  进入系统
input keyevent KEYCODE_BACK # 模拟返回键
input keyevent keyevent 3 # 模拟返回键

常见的按键可以在http://developer.android.com/reference/android/view/KeyEvent.html查看
2. 对获得焦点的输入框,输入文本

1
input text hello #  输入hello文本

输入的文本不能带空格,也不能是中文
3. 模拟点击屏幕事件

1
input tap 100 200 #  在屏幕坐标(100,200)处点击
注:坐标是从左上角开始计算的

还可以模拟长按、滑动等

  • 命令 input [] […]
    • source 指定输入设备
      • trackball 轨迹球
      • joystick 操控杆
      • touchnavigation
      • mouse
      • keyboard
      • gamepad
      • touchpad
      • dpad
      • stylus
      • touchscreen
    • command 指定动作
      • text (默认设备touchscreen)
      • keyevent [–longpress] … (默认设备keyboard)
      • tap (默认设备touchscreen)
      • swipe [duration(ms)] (默认设备touchscreen)
      • press (默认设备trackball)
      • roll (默认设备trackball)
      • tmode

使用Instrumentation

Instrumentation是Android用来测试的工具,可以监测系统与应用程序之间的交互,可以使用他发送按键或者触屏事件

  • 发送按键
1
2
Instrumentation mInst = new Instrumentation();
mInst.sendKeyDownUpSync(KeyEvent.KEYCODE_CAMERA); // 同步发送一个按下和弹起事件
  • 触屏事件
1
2
3
4
5
Instrumentation mInst = new Instrumentation();  
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0);
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
  • 发送文本
1
sendPointerSync("text");
注:以上代码都需要权限的支持,需要在AndroidManifast.xml中添加<uses-permission android:name="android.permission.INJECT_EVENTS"/> ,但还有一些复杂的问题,可以参考[这里](http://stackoverflow.com/questions/5383401/android-inject-events-permission/7328055# 7328055)

使用内部API

在Android系统中,有些内部的API提供注入事件的方法。因为是内部API,在不同版本上可能变化比较大。使用如果想在普通App中使用,可能需要通过反射机制来调用。

在Android API 16之前,WindownManager有相应的方法提供注入事件的方法,如下:

1
2
3
4
5
6
IBinder wmbinder = ServiceManager.getService("window");  
IWindowManager wm = IWindowManager.Stub.asInterface(wmbinder); //pointer
wm.injectPointerEvent(myMotionEvent, false); //key
wm.injectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A), false);
wm.injectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A), false); //trackball
wm.injectTrackballEvent(myMotionEvent, false);

在API 15之后,引入了InputManager,把上面的哪些injectXXXEvent()方法从WindowManager中移除了。使用方法类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IBinder imBinder = ServiceManager.getService("input");  
IInputManager im = IInputManager.Stub.asInterface(imBinder);

//inject key event
final KeyEvent keyEvent = new KeyEvent(downTime, eventTime, action,
code, repeatCount, metaState, deviceId, scancode,
flags | KeyEvent.FLAG_FROM_SYSTEM |KeyEvent.FLAG_KEEP_TOUCH_MODE | KeyEvent.FLAG_SOFT_KEYBOARD,
source);
event.setSource(InputDevice.SOURCE_ANY)
im.injectInputEvent(keyEvent, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);

//inject pointer event
motionEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
im.injectInputEvent(motionEvent, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);

从API 16开始,InputManager就成了一个公开的类了,可以通过如下方法获得InputManager实例:

1
InputManager im = (InputManager) getSystemService(Context.INPUT_SERVICE);  
注意,使用injectEvent()需要申明android:name="android.permission.INJECT_EVENTS"权限。
  1. 使用Nativ/JNI调用
    察看Android设备的/dev/input/目录下的设备:
1
2
3
4
5
6
7
shell@user:/dev/input $ ll  
crw-rw---- root input 13, 64 2013-08-11 18:00 event0
crw-rw---- root input 13, 65 2013-08-11 18:00 event1
crw-rw---- root input 13, 66 2013-08-11 18:00 event2
crw-rw---- root input 13, 67 2013-08-11 18:00 event3
crw-rw---- root input 13, 68 2013-08-11 18:00 event4
crw-rw---- root input 13, 69 2013-08-11 18:00 event5

可以看到有一些输入设备节点,同时也提供了一些shell工具来操作这些设备,例如上面第1节中提到的input命令,另外还有getevent和sendevent工具分别来监听和发送事件。这些方法,都可以通过JNI的方式调用。这里需要注意的时间eventX设备都是input的用户组,要直接使用,需要root设备。

特别的是,这里有一个开源项目android-event-injector,使用JNI方法注入事件。当然设备需要root。

  • onAttach() 关联Activity时调用

  • onCreate() 创建Fragment时调用,在这里必须初始化Fragment的基础组件

  • onCreateView() Fragment要绘制自己的界面时调用,这个方法必须返回Fragment的layout,也可以返回null(表示没有界面)

  • onActivityCreated() 当Activity对象完成自己的onCreate方法时调用

  • onStart() Fragment的UI可见时调用

  • onResume() Fragment的UI可交互时调用

  • onPause() Fragment 可见但不可交互时调用

  • onStop() Fragment 完全不可见时调用

  • onDestroyView() Fragment 移除视图时调用

  • onDestroy() 清理View资源时调用

  • onDetach() 失去Activity关联时调用

  • 切换到Fragment(第一次)

    • onAttach
    • onCreate
    • onCreateView
    • onActivityCreated
    • onStart
    • onResume
  • 屏幕熄灭

    • onPause
    • onSaveInstanceState
    • onStop
  • 屏幕解锁

    • onStart
    • onResume
  • 切换到其他Fragment

    • onPause
    • onStop
    • onDestroyView
  • 切换回本身

    • onCreateView
    • onActivityCreated
    • onStart
    • onResume
  • 回到桌面

    • onPause
    • onSaveInstanceState
    • onStop
  • 回到应用

    • onStart
    • onResume
  • 退出应用

    • onPause
    • onStop
    • onDestroyView
    • onDestroy
    • onDetach

  • animator 存放property animations文件
  • anim 存放帧动画、属性动画xml文件,property animations可以存放在anim里,但是animator的目录下的xml较高的优先级
  • color 颜色xml
  • drawable 图片,格式包括Bitmap files(.png,9.png,.jpg,.gif)或者XML(State lists)状态列表的XML
    • Bitmap files .png格式
    • Nine-Patches(re-sizable bitmaps).9.png格式图片
    • State lists状态列表的XML
    • Shapes shape的XML
    • Animation drawables动画XML
    • Other drawables其他图片
  • layout 布局文件
  • menu 菜单
  • raw 资源
  • values
    • arrays.xml 数组资源
    • colors.xml 颜色
    • dimens.xml 尺寸文件
    • string.xml 字符串
    • style.xml 风格文件
  • xml xml文件

命名规则

  • MCC and MNC 通信方式
  • Language and region(地区和语言)
    • en
    • fr
    • en-rUS
    • fr-rFR
    • fr-rCA
  • res/
    • layout/
    • layout-ar/ (阿拉伯方式,从右到左)
    • layout-ldrtl (从右到左,但根据语言限定有更高的优先级)
    • sw(smallest width,最小宽度)
      • sw320dp
      • sw600dp
      • sw720dp
    • Available Width(可用宽度,这里会根据屏幕的选择而改变)
      • w720dp
      • w1024dp
    • Available Height(可用高度)
      • h720dp
      • h1024dp
    • Screen Size
      • small
      • normal
      • large
      • xlarge
    • Screen Aspect
      • WQVGA,WVGA,FWVGA
      • QVGA,HVGA,VGA
    • UI mode(根据系统区分,汽车或者可穿戴设备)
      • car
      • desk
      • television
      • appliance
      • watch
    • Night Mode(夜晚模式)
      • night
      • notnight
    • Screen pixel density(dpi屏幕密度)
      • ldpi 120dpi
      • mdpi 160dpi
      • hdpi 240dpi
      • xhdpi 320dpi
      • xxhdpi 480dpi
      • xxxhdpi 640dpi
      • nodpi 不放大
      • tvdpi 介于mdpi和hdpi之间
    • TouchScreen Type
      • notouch 没有触摸屏
      • finger 有触摸屏
    • Keyboard availability 键盘可用性
      • keysexposed 有键盘
      • keyshidden 有可隐藏的硬件键盘
      • keyssoft 没有键盘
    • Primary text input method 主要的输入方式
      • nokeys 没有物理键盘
      • qwerty 有一个物理键盘,无论用户是否可见
      • 12key 有一个12个键的键盘,无论用户是否可见
    • Navigation key availability 系统导航栏是否可用
      • navexposed 用户可以使用系统导航栏
      • navhidden 不可以使用
    • Platform Version (API level) 平台版本,不能的API版本使用不同的布局.例如5.0以上的系统可以使用卡片等主题.
      • v3
      • v4
      • v7

Context可能是Android中最常用的元素之一,但也是最容易用错的。
Context对象常见的功能,有传递引用、加载资源、启动Activity、获取系统服务、获取内部文件路径以及创建View,但是Context的功能远不止这些。

Read More

方法一

打开这个网站http://www.androiddevtools.cn/,网站上基本上有你需要的SDK或者其他全部工具(如果没有请fork一下吧,把你知道添加进去!),具体安装下载请仔细阅读相关说明,正确配置即可。由于资源基本上都在百度云盘,下载速度必然刚刚的。

方法二

在Android Studio中打开SDK Manager如下:

在mac上可以直接使用快捷键cmd + ,来打开SDK Manager Setting,Windows下可以在SDK Manager中在菜单栏找到Tools -> Options也能找到下面这个设置界面

设置HTTP Proxy Server: <mirrors.neusoft.edu.cn>
设置HTTP Proxy Port: 80
并且可以强制使用http代替https

方法三

VPN,花钱买自由!