Android给自定义按键添加广播和通过广播给当前焦点输入框赋值

一、给自定义按键添加广播

修改PhoneWindowManager.java中的interceptKeyBeforeDispatching方法

/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

 1     @Override
 2     public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
 3         final boolean keyguardOn = keyguardOn();
 4         final int keyCode = event.getKeyCode();
 5         final int repeatCount = event.getRepeatCount();
 6         final int metaState = event.getMetaState();
 7         final int flags = event.getFlags();
 8         final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
 9         final boolean canceled = event.isCanceled();
10         final boolean longPress = (flags & KeyEvent.FLAG_LONG_PRESS) != 0;
11         final boolean virtualKey = event.getDeviceId() == KeyCharacterMap.VIRTUAL_KEYBOARD;
12         final String isCitKeyTest=SystemProperties.get("persist.sys.startCitKeyTest");
13
14
15
16         //添加自定义按键广播----开始
17         switch (keyCode)
18             {
19                 case 135:
20                 case 136:
21                 case 137:
22                 case 139:
23                 {
24                     if (repeatCount == 0) {
25
26                         Intent myKeyIntent = new Intent();
27
28
29                         if(down)
30                         {
31                             myKeyIntent.setAction("com.rscja.android.KEY_DOWN");
32                         }
33                         else
34                         {
35                             myKeyIntent.setAction("com.rscja.android.KEY_UP");
36                         }
37
38
39                         myKeyIntent.putExtra("keycode", keyCode);
40
41                         mContext.sendBroadcastAsUser(myKeyIntent, UserHandle.ALL);
42
43
44
45                     }
46                 }
47
48
49
50                     break;
51             }
52
53             //添加自定义按键广播----结束
54
55
56
57
58 ……
59 ……
60 ……
61 ……
62
63 }

二、通过广播给当前焦点输入框赋值

修改InputMethodService.java中的onCreate()方法

/frameworks/base/core/java/android/inputmethodservice/InputMethodService.java

 1     @Override public void onCreate() {
 2         mTheme = Resources.selectSystemTheme(mTheme,
 3                 getApplicationInfo().targetSdkVersion,
 4                 android.R.style.Theme_InputMethod,
 5                 android.R.style.Theme_Holo_InputMethod,
 6                 android.R.style.Theme_DeviceDefault_InputMethod,
 7                 android.R.style.Theme_DeviceDefault_InputMethod);
 8         super.setTheme(mTheme);
 9         super.onCreate();
10         mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
11         mInflater = (LayoutInflater)getSystemService(
12                 Context.LAYOUT_INFLATER_SERVICE);
13         mWindow = new SoftInputWindow(this, "InputMethod", mTheme, null, null, mDispatcherState,
14                 WindowManager.LayoutParams.TYPE_INPUT_METHOD, Gravity.BOTTOM, false);
15         if (mHardwareAccelerated) {
16             mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
17         }
18         initViews();
19         mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT);
20
21
22         //注册广播监听
23         IntentFilter barCodeCheckFilter = new IntentFilter("com.rscja.android.DATA_RESULT");
24         mRootView.getContext().registerReceiver(m_barCodeCheckReciever,barCodeCheckFilter);
25
26     }
27
28
29     //添加自定义广播
30      private BroadcastReceiver m_barCodeCheckReciever = new  BroadcastReceiver () {
31
32         @Override
33         public void onReceive(Context context, Intent intent) {
34         InputConnection conn = getCurrentInputConnection();
35
36         String intent_data=intent.getStringExtra("data");
37
38
39         if(intent_data.charAt(intent_data.length() - 1)==‘\n‘)
40         {
41             if (conn != null) {
42             conn.commitText(intent_data.substring(0,intent_data.length()-1), 1);
43             }
44             sendKeyChar(‘\n‘);
45         }
46         else
47         {
48             if (conn != null) {
49                 conn.commitText(intent_data, 1);
50                 }
51             }
52         }
53     };
时间: 2024-08-10 19:16:23

Android给自定义按键添加广播和通过广播给当前焦点输入框赋值的相关文章

Android按键添加和处理的方案【转】

本文转载自:http://www.cnblogs.com/skywang12345/p/3142851.html Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Android按键添加和处理的方案 Sky Wang  2013/06/18        需求:Android机器上有个Wifi物理按键,现在需求通过点击“wifi物理按键”能够快速的开启/关闭wifi. 实现方案经过思考之后,拟出下面几种方案:方案一,在linux kernel的驱动中捕获“wifi物理按

Android自定义视图三:给自定义视图添加“流畅”的动画

在第二部分我们实现了一个简单的折线图.这里假设你已经读了前篇.下面我们将继续为这个折线图添砖加瓦. 我在想给这个图的上方添加三个按钮,这样用户可以点选不同的按钮来查看不同类别的数据.比如,用户可以查看走路的.跑步的和骑车的.用户点不同的按钮,我们就跟还不同的运动数据显示在图形里. 我们实现了按钮点击后,设置不同的坐标点数据,然后运行APP.你会发现,虽然方法setChartData()已经被调用了,但是图形一点变化都没有.为什么呢?因为我们没有通知折线图"重绘".这可以通过调用inva

Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

BroadcastReceiver普通广播.有序广播.拦截广播.本地广播.Sticky广播.系统广播 本篇文章包括以下内容: 前言 BroadcastReceiver的简介 普通广播(自定义广播) 有序广播 拦截广播 本地广播 Sticky广播 系统广播 部分源码下载 前言 又是一篇基础总结性的文章来啦,个人强迫症犯了,非得把博客的四大组件模块给补齐了,总结了一下BoradcastReceiver的各种使用,废话不多说,开车啦.博主建议自己敲一遍代码来理解广播,因为里面有很多细节的东西需要注意,

Android学习(十三) BroadcastReceiver组件(广播)

一.Broadcast(广播) 是一种广泛应用在应用程序之间传输信息的机制. 二.Broadcast(广播接收器) 是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播. 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,

【原创】android——Tabhost 自定义tab+底部实现+intent切换内容

1,实现tabhost自定义格式,再此仅仅显示背景和文字,效果图预览:(底边栏所示) (图片变形) 2,xml配置 activity_user的XML配置  1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/tabhost&qu

Android复杂自定义Listview实现

在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记). 可参考博客:http://cinderella7.blog.51cto.com/7607653/1281696  (这里用MVC的思想去理解Listview,个人认为还是不错的) http://blog.csdn.net/jueblog/article/details/11857281   (一个完整的实现) ----------------

Android广播之注册广播(包括静态广播和动态广播的注册)源码分析

Android广播按发送方式分类有三种:无序广播.有序广播(OrderedBroadcast)和粘性广播(StickyBroadcast). 静态广播的注册流程: 在系统服务启动时会添加PackageManagerService,在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析.先看下时序图: 先看PackageManagerService类的构造方法: // Keys are String (package name), values are Package. This als

android中自定义view涉及到的绘制知识

android中自定义view的过程中,需要了解的绘制知识. 1.画笔paint: 画笔设置: <span style="font-size:14px;"> paint.setAntiAlias(true);//抗锯齿功能 paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(30);//设置画笔宽度 paint.setShadowLayer(

Android笔记(二十七) Android中的动态广播和静态广播

广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低>\ 2.动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期.注意: 在activity结束前,移除广播接收器. 静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行. 3.在同一个优先级下,谁先启动的快,谁将先接收到广播. 动态注册代码: Upda