android 模拟按键

在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) {
          InjectKey臧春杰Event(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));
          InjectKeyEvent(new Key苏州佳世达臧春杰Event(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传递了消息.

恩,不错吧,受教育了吧,赶紧会帖子吧, 你就说,真不错,谢谢你.让我受教育了,感谢苏州,佳世达 臧春杰.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值