【Android源码 栏目提醒】:网学会员为需要Android源码 的朋友们搜集整理了Android的全局键(home键_长按耳机键)详解【android源码 - 教育相关资料,希望对各位网友有所帮助!
Android 的全局键 详解 (home 键/长按耳机键) 【android 源码解析八】Android 的全局键(home键/长按耳机键)详解【android 源码解析八】 如果想在 Android 手机要想扩展一个实体键,就我知道而言有两种方法,基于Android4.0 的源码来分析的和 2.3 的源码有点区别,区别不大,下面分享给大家: 转载请标明出处: ( 一 ) 可 以 在 frameworks 层 的 KeyEvent.java 这 个 类 中 定 义 一 个 值 , 在 (Home 键就是这么实现的)PhoneWindowManager.java 这个类中做处理就可以了。
。
效果图如下:(二)可以利用广播的形式,frameworks 层 PhoneWindow.java 这个类的 onKeyDown 对这个实体键发广播,上层接受这个广播来处理也可以达到这个效果。
耳机键就是利用广播来接受的。
无论在哪个界面长按耳机键,都会进入到音乐的界面。
(长按耳机键的)效果图如下:下面我详细展开来说明一下:一、先说 Home 键的实现的大致流程,即----gt为什么点击 Home 键,都进入到 launcher 的待机界面; (1)Home 键的定义在 step1: frameworks/base/core/java/android/view/KeyEvent.java 这 个 类 中 在KeyEvent.java 这个类中有个 static 的静态块: static populateKeycodeSymbolicNames step2: 这个 populateKeycodeSymbolicNames()方法其实就是加载了许多键的定义,把这些键对应的值都放到 Array 数组中。
private static void populateKeycodeSymbolicNames SparseArrayltStringgtnames KEYCODE_SYMBOLIC_NAMES names.appendKEYCODE_UNKNOWNquotKEYCODE_UNKNOWNquot names.appendKEYCODE_SOFT_LEFT quotKEYCODE_SOFT_LEFTquotnames.appendKEYCODE_SOFT_RIGHT quotKEYCODE_SOFT_RIGHTquotnames.appendKEYCODE_HOME quotKEYCODE_HOMEquot names.appendKEYCODE_BACKquotKEYCODE_BACKquot names.appendKEYCODE_CALL quotKEYCODE_CALLquotnames.appendKEYCODE_ENDCALL quotKEYCODE_ENDCALLquot names.appendKEYCODE_0quotKEYCODE_0quot names.appendKEYCODE_1 quotKEYCODE_1quotnames.appendKEYCODE_2 quotKEYCODE_2quot names.appendKEYCODE_3 quotKEYCODE_3quotnames.appendKEYCODE_4 quotKEYCODE_4quot names.appendKEYCODE_5 quotKEYCODE_5quotnames.appendKEYCODE_6 quotKEYCODE_6quot names.appendKEYCODE_7 quotKEYCODE_7quotnames.appendKEYCODE_8 quotKEYCODE_8quot names.appendKEYCODE_9quotKEYCODE_9quot step3: 而 Home 键对应的值如下: / Key code constant: Home key. This key is handled by the framework and isnever delivered to applications. / public static final int KEYCODE_HOME 3( 2 ) Home 键 的 处 理 如 下 : 在 step1:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 这个类中: ( 中处理有对 Home,在这个方法 interceptKeyBeforeDispatching ... ... ...) menu, Search,音量大小键等等: / inheritDoc / Override public longinterceptKeyBeforeDispatchingWindowState win KeyEvent event int policyFlags final boolean keyguardOn keyguardOn final int keyCode event.getKeyCode final int repeatCount event.getRepeatCountfinal int metaState event.getMetaState final int flags event.getFlags final boolean down event.getAction KeyEvent.ACTION_DOWN final boolean canceled event.isCanceledif false Log.dTAG quotinterceptKeyTi keyCodequot keyCode quot downquot down quot repeatCountquot repeatCount quot keyguardOnquot keyguardOn quot mHomePressedquot mHomePressed // If we think wemight have a volume down amp power key chord on the way // but were not surethen tell the dispatcher to wait a little while and // try again later beforedispatching. if flags amp KeyEvent.FLAG_FALLBACK 0 ifmVolumeDownKeyTriggered ampamp mPowerKeyTriggered final long now SystemClock.uptimeMillis final long timeoutTime mVolumeDownKeyTime SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS ifnow lt timeoutTime return timeoutTime -now if keyCode KeyEvent.KEYCODE_VOLUME_DOWN ampampmVolumeDownKeyConsumedByScreenshotChord if down mVolumeDownKeyConsumedByScreenshotChord false return -1 // First we always handle the home key here so applications // can never breakit although if keyguard is on we do let // it handle it because that givesus the correct 5 second // timeout. if keyCode KeyEvent.KEYCODE_HOME // If we have released the home key and didntdo anything else // while it was pressed then it is time to go homeif mHomePressed ampamp down mHomePressed false ifcanceled // If an incoming call is ringing HOME is totallydisabled. // The user is already on the InCallScreen at thispoint // and his ONLY options are to answer or reject the call.boolean incomingRinging false try ITelephony telephonyService getTelephonyServiceif telephonyService null incomingRinging telephonyService.isRinging catch RemoteException ex Log.wTAG quotRemoteExceptionfrom getPhoneInterfacequot ex ifincomingRinging Log.iTAG quotIgnoring HOME theres aringing incoming call.quot else launchHomeFromHotKey else Log.iTAG quotIgnoring HOME eventcanceled.quot return -1 // If a system window has focus then it doesnt make sense // right nowto interact with applications. WindowManager.LayoutParams attrs win null win.getAttrs : null if attrs null finalint type attrs.type if type WindowManager.LayoutParams.TYPE_KEYGUARD type WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG // thequotappquot is keyguard so give it the key return 0 final int typeCount WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.lengthfor int i0 ilttypeCount i if type WINDOW_TYPES_WHERE_HOME_DOESNT_WORKi // dont doanything but also dont pass it to the app return-1 if down if repeatCount 0 mHomePressed true else if event.getFlags amp KeyEvent.FLAG_LONG_PRESS 0 ifkeyguardOn handleLongPressOnHome return -1 else if keyCode KeyEvent.KEYCODE_MENU ........ Step2: 插曲《网上有例子说怎么在自己的应用中屏蔽 Home 键》---gt原理:是在你的应用的 Activity 中加入了锁屏的 type,因为系统对锁屏界面,点击 Home 键失效!网摘代码如下:public class DMActivity extends Activity private boolean flag true//true 位 屏 蔽 , false 位 不 屏 蔽Override public void onCreateBundle savedInstanceState super.onCreatesavedInstanceStatesetContentViewR.layout.main Override public voidonAttachedToWindow
上一篇:
Android
下一篇:
马升强论文2011204074