穿拖鞋写程序

在android 系统中,可能有的朋友需要这样的功能.按下Activity中的一个button,它的反映就象按下了硬件的home键. 应该来说这样的功能是可以实现的.为什么这样说呢?按了硬件,驱动程序会生成消息放到系统的消息队列里,我突然想到了MFC的消息队列.呵呵,什么是消息队列呢?你见过消息队列吗? 呵呵,消息队列只是一中数据结构,双向连表完全可以是消息队列啊.呵呵。跑题了.既然驱动能把消息放到消息队列,,那AP是否可以主动生成一个消息,放到消息队列呢?原理来说是可以的.那如何生成消息呢?又如何传到系统的消息队列呢? 如果解决了这两个问题,就可以了.操作系统不管你消息是硬件产生的,还是软件模拟产生的,有消息来了,我就读,然后做处理就好了.恩,那开始解决这两个问题.首先我们得明白我是要模拟一个按键消息,那自然想到是个keyEvent事件了.那又如何放到消息队列中呢?那得看framework ,行好,我替你看了.口说无凭,看例子.

import android.app.Activity;import android.os.Bundle;import android.os.DeadObjectException;import android.os.ServiceManager;import android.view.IWindowManager;import android.view.KeyEvent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;public class SimualteKeyInput extends Activity {final IWindowManager windowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));public void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);this.findViewById(R.id.cmd_simulate_key).setOnClickListener(new OnClickListener() {public void onqisda changerClick(View arg0) {new Thread(new Runnable() {public void run() {simulateKeystroke(KeyEvent.KEYCODE_HOME);}}).start();}});}private void simulateKeystroke(int KeyCode) {InjectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));InjectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyCode));}private void InjectKeyEvent(KeyEvent kEvent) {try {windowManager.injectchangerchangerKeyEvent(kEvent,true);} catch (Exception e) {e.printStackTrace();}}}

哎,这就很高兴了,终于出来了.但是有点问题.什么问题呢?该代码不能在android sdk 1.6上运行,无法编译,import android.view.IWindowManager;关键是这句不行.这没办法,这需要在有framework的地方就可以了.如果你有兴趣你可以仔细看看。 具体的如何把消息放到消息队列了,是通过Binder连接到WindowManagerService里,通过IWindowMangaer.aidl传递了消息.

你曾经说,等我们老的时候,

穿拖鞋写程序

相关文章:

你感兴趣的文章:

标签云: