我正在尝试实现一个输入方法服务,该服务接收远程客户端发送的意图,并响应那些发送适当的KeyEvent
我在输入法服务中使用这种方法
private void keyDownUp(int keyEventCode)
{undefined
getCurrentInputConnection()sendKeyEvent(
new KeyEvent(KeyEventACTION_DOWN, keyEventCode));
getCurrentInputConnection()sendKeyEvent(
new KeyEvent(KeyEventACTION_UP, keyEventCode));
}
像在Simple Sofykeyboard Sample中一样发送KeyEvents,它可以在家中,在Activities中工作……但是当Dialog或Spinner的菜单在前台时它不起作用
事件将发送到Dialog后面的父活动
有没有办法发送密钥和控制设备,如使用输入法的硬件密钥?
更好地解释我正在尝试做什么:
我有点写一个输入法,允许从远程控制设备
我在客户端(桌面PC上的java应用程序)中写入命令(例如“UP”),设备上的服务器使用sendBroadcast()发送带有信息的intent,并且输入方法中的接收器获取它并且使用DPAD_UP键的键代码调用keyDownUp
它通常有效,但当我转到显示对话框的应用程序时,keyDownUp方法不会将键事件发送到对话框,例如选择是或否按钮,但它会一直控制对话框后面的活动
Here我发现有同样问题的人……但没有答案……
1、注意C/C++不能直接返回一个数组。这是由于在C/C++中,数组不是一种类型,因此不能被直接返回。
2、在C/C++中,一般有两种方法来返回一个数组。
第一种方法:
返回一个指向数组的指针,例如char (retArray)[10]声明了一个函数retArray,该函数可以返回指向具有10个char元素的数组例子如下:#include#includeint (retArray())[10]{int (a)[10];int i=0;/动态开辟空间/
a=calloc(10,sizeof(int));/赋值/for(i=0;i<10;i++){(a)[i]=i;}return a;}int main(){int (b)[10];
/函数返回指向数组的指针/
b=retArray();
/打印第一个元素/
printf("%d/n",(b)[0]);
/释放空间/free(b);return 0;}第二种方法:
如果你不喜欢用指针的形式返回数组,那么可以采用返回一个结构的形式。这种形式相对较安全,可以避免忘记释放指针而造成内存泄露,也可以避免访问悬挂指针造成的错误。但缺点是由于结构是先拷贝再返回,因此如果结构较大时,会影响效率和占用较大内存。
例子如下:#includestruct tag{int a[10];}x,y;struct tag retArray(){int i=0;for(i=0;i<10;i++)
xa[i]=i;return x;}int main(){struct tag y=retArray();
printf("%d/n",ya[3]);return 0;}注意:(1)在返回指针时要切记要避免内存泄露和访问悬挂指针。
(2)很多人认为指针和数组等价的,这是错误的。int (a)[10]和int b[10]两者是不能直接用a=b来赋值的。在数组和指针作为函数参数传递时,二者可以认为等价,这是因为数组会被转化为指针来传递。
(3)返回多维数组方法类似。
锁定解锁屏幕
driverlock(5)
将把当前应用放到后台 5 秒
driverbackground_app(5)
收起键盘
driverhide_keyboard()
启动 ACTIVITY
在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity 。 只能在 Android 上使用
driverstart_activity('comexampleandroidapis', 'Foo')
打开下拉通知栏 只能在 Android 上使用
driveropen_notifications()
检查应用是否已经安装
driveris_app_installed('comexampleandroidapis')
安装应用
driverinstall_app('path/to/myapk')
删除应用
driverremove_app('comexampleandroidapis')
摇晃 (SHAKE) 关闭应用
drivershake()
关闭应用
driverclose_app()
启动 (LAUNCH)
根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。这不是用于启动指定的 app/activities ————你可以使用 start_activity 做到这个效果————这是用来继续进行使用了 autoLaunch=false 关键字时的初始化 (Launch) 流程的
driverlaunch_app()
应用重置(相当于卸载重装应用)
driverreset()
列出所有的可用上下文 (CONTEXT)
context 可以理解为 可进入的窗口 。例如,对于原生应用,可用的 context 和默认 context 均为 NATIVE_APP
drivercontexts
列出当前上下文
drivercurrent_context
获取当前页面的源码(可以辅助元素定位)
driverpage_source
截图屏幕
driverget_screenshot_as_file(r'E:\img\img1png') # 截取整个屏幕
获取应用程序的字符串 (APP STRINGS)
driverapp_strings
给设备发送一个按键事件(KEY EVENT)(只限安卓)
driverkeyevent(176)
获取当前 activity。只能在 Android 上使用
drivercurrent_activity
模拟用户滑动(SWIPE)
driverswipe(start=75, starty=500, endx=75, endy=0, duration=800)
捏屏幕(PINCH) (双指往内移动来缩小屏幕)
driverpinch(element=el)
放大 (ZOOM)屏幕 (双指往外移动来放大屏幕)
driverzoom(element=el)
滑动 (SCROLL)到某个元素。从一个元素滚动到另一个元素
driverscroll(originalEl, destinationEl ) # originalEl - 要滚动的元素 destinationEl - 要滚动到的元素
设置元素的值
driverset_value(element=el,Val) # 设置 el 元素的值
推送文件到设备中去(PUSH FILE),推送文件需要转换为'base64'
获取/设置 appium 的服务器设置。
多个点点击(最多五个点)
drivertap([(100, 20), (100, 60), (100,100)], 500) # list 中的元组放 5 个点,500 表示按下 500ms
J2ME与Android程序部分比较
一、程序入口
J2me程序入口类为MIDlet,所有的j2me程序都要继承该类来初始化j2me程序。Android程序入口是Activity类。下面先看看她们的生命周期。
J2me MIDlet生命周期
1、startApp (活动状态)程序启动的时候会调用该方法来初始化用户需要的资源。
2、PauseApp (暂停状态)当手机来电接电话的时候,会调用该接口。用户可以调用该接口停止也写线程的 *** 作。
3、destroyApp (销毁状态)程序退出的时候调用。用户可以调用该接口处理处于活动状态的线程。
该几个周期状态有AMS调用转换,也可以程序代码调用转换。resumeRequest调用会的结果是AMS会调用startApp方法,notifyPaused调用的结果是可能AMS调用PsuseApp,notifyDestroyed调用会使AMS销毁该midlet。
Android Activity生命周期
1、onCreate 程序开始初始化的时候调用该接口,用户导航返回到Activity的时候也会调用该接口。类似于J2me里面多个 Canvase(Displayable)切换。所以Activity也类似于Displayable。
2、onStart onCreate调用完后,程序调用该接口。
3、onResume onStart调用后调用该接口。此时Activity进入运行状态。
4、onPause 新的Activity启动的时候调用该接口。
5、onStop 该Activity 不可见的时候调用。
6、onDestroy 程序销毁的时候调用。
二、显示组件
J2me中所有可显示的组件都是直接或间接的继承了Displayable,直接的是Canvas和Screen。不同的继承导致了低级 UI和高级UI的区别。J2me中现成的UI组件都是直接或者间接继承了Screen。只要调用DisplaygetDisplay(MIDLet instan)setCurrrent(Displayable disp),就可以把组件显示到手机界面上。切换界面的时候也可以使用该接口。
Android可见的组件直接或者间接继承了androidviewView。通过 ActivitysetContentView(View view)就可以显示在android手机界面上,切换界面的时候也可以使用该接口。如果是直接继承了View而不是Android自带的UI组件,那么还要自己去实现它的刷新,类似J2me的低级UI组件。
三、刷新处理
J2me刷新:
J2me高级UI组件由组件内部刷新实现,低级UI可以通过Canvas的repain()来刷新。低级UI架构可以用MVC方式来实现,建议使用二级缓存。
Android刷新:
Android提供接口onLayout来提供该View调整其里面组件元素的位置布局,用户只需要重写该接口就ok。刷新接口 onDraw,该接口用来刷新界面里面的绘制元素。该接口类似j2me Canvas的paint接口。不过两个平台传得参数有些意思。J2me传的时Graphics,而android传得是Canvas。Android绘制的时候会传入一个参数Paint。该对象表示绘制的风格,比如颜色,字体大小,字体格式等。如果是移植的话,建议android也使用二级缓存,这样也容易管理。
四、用户事件处理
J2me的键盘、触笔事件都是通过Canvas定义接口分发。用户只需要从写这些接口就ok。它们分别是。键盘接口为:keyPressed(),keyRepeated(),keyReleased()。触笔接口为:pointerPressed(),pointerReleased(),pointerDragged()。
Android的键盘,触笔通过View中定义,只要override其接口就ok了。触笔处理接口onTouchEvent。软键盘 onKeyDown()、onKeyUp()、onTracKballEvent()。
记得冯·诺依曼大神曾经对我们这些后辈说过,计算机是由运算器、控制器、存储器、输入设备和输出设备五大部分组成的。我们看看现如今的手机(mobile device),可以看到前面所述五大部分一样不少,这就是所谓的麻雀虽小,五脏俱全。但是由于设备的限制,手机在输入、输出设备上有很大的限制,在今天要谈到的用户输入响应上,于是就只由两种了,一个是手机按键,另一个是触摸屏。
在J2ME下,Canvas可以响应按键事件与触摸屏事件,它封装了六个protected的方法,响应六种不同的事件:keyPressed(int keyCode)用于响应按键压下、keyReleased(int keyCode)用于响应按键释放、keyRepeated(int keyCode)用于响应按键长时间压下不释放;pointerDragged(int x,int y)用于响应触摸屏拖拽、pointerPressed(int x,int y)用于响应触摸屏点击、pointerReleased(int x,int y)用于响应触摸屏释放。其中参数方面,keyCode告诉我们哪个按键触发的事件,x、y分别告诉我们触摸屏被点击的坐标(绝对位置)。
在Android下,View同样可以响应以上两种事件,分别有:boolean onKeyDown(int keyCode,KeyEvent event)用于响应按键点击、boolean onKeyMultiple(int keyCode, int repeatCount,KeyEvent event)用于响应按键重复点击、boolean onKeyUp(int keyCode,KeyEvent event)用于响应按键释放以及onTouchEvent(MotionEvent event)用于响应触摸屏事件。官方API指出onKeyMultiple方法总是返回false的,即它没有handle,因此必须重写才能实现。
在键盘事件方面,J2ME与Android的区别在于Android中定义了KeyEvent这个类,用于描述按键事件。这个KeyEvent可不简单,它能够将一个按键事件描述的淋漓尽致。它的getAction()方法,可以得到按键的行为(down、up or multiple);它的getDownTime()可以得到最近一次keyDown事件发生的时间;它的getEventTime()可以得到本次事件发生的时间;它的getRepeatCount() 可以得到同一按键被连续点击的次数(这个很大程度上是为onKeyMultiple方法设计的)。经过我的实践,我认为有一点是非常需要注意的,Android底层在触发keyDown事件时,有一点与J2ME很不一样:比如我们按下一个键但不释放,J2ME只触发一次keyDown事件由 keyPressed()执行,然后就交给keyRepeated()处理,然而Android是每隔一段时间(几十毫秒)就触发一次,onKeyDown方法会连续响应事件,造成意想不到的事情。想解决这个问题倒也不难,你可以通过getAction判断这次事件是否是 keyDown,如果是的话,用getEventTime()减去getDownTime(),如果这个数值太小,可以选择不响应。这个方法简单,但是如果用户输入太快,真正的输入也可能被忽略掉,所以还有另外一种方法:维护一个堆栈,在重写onKeyDown()与onKeyUp()方法的时候,如果 getAction()是keyDown,就入栈,如果是keyUp,就出栈,如果得到一个事件,当它是keyDown的时候,如果当前栈顶是 keyDown,就选择性不响应这个事件,这样的话,长点击就相当于一次点击。其实有一些view的子类,比如Button加入了 onLongClick()的处理方法这样即使你用选中这个view,长时间按下选择键,也可以相应的处理。
在触摸屏方面,Android只有onTouchEvent()来处理,但是由于它的参数中有MotionEvent,所以J2ME下分开的三种事件可以通过MotionEvent的getAction()方法加以区分。比较有意思的是MotionEvent中有一个getPressure()方法,能够得到点击的压力,看来Android手机的元件精密程度很高,乃至软件可以得到压力的大小并通过它来做一些逻辑。
还有一点,Android的KeyEvent与MotionEvent是可以自己构造的,KeyEvent可以通过dispatch()方法将自己传递给 KeyEvent的Callback,即事件响应处理方法,这样就能让我们做一个软键盘出来(乍看起来比做windows软键盘简单,其实也并不容易,要是把它作为一个Activity跑得话,焦点问题还很麻烦),也可以做许多别的事情,这一点J2ME好像没有做到。
以上就是关于安卓怎么把发送键弄到键盘上全部的内容,包括:安卓怎么把发送键弄到键盘上、c4中的system(ls)返回值怎么保存到指针数组 return 0;})、appium(四) *** 作介绍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)