关键词:
例如上图,在按下菜单键后会弹出对应的菜单选项,准确来说,是在菜单键弹起后出现的一个popupwindow,那么从菜单键弹起到popupwindow创建所涉及到的历程是怎样的呢?
理论上是底层监测menu按键键值,通知framework层,framework经过一系列的处理后分发给上层,或者拦截掉
现在是假设framework层已经把menu按键分发给了用户,那么接下里就是activity进行响应,所以从Activity开始看起,整体流程如下:
从按键弹起framework层分发到activity开始,到弹出popupwindow结束整个流程图
代码所在目录如下
流程图中所涉及到的一些只是单纯的作为中介调用了一下,按着流程自己也可以看到,现在是挑一些有用的进行分析
1,第一个需要分析的就是Activity.java文件中的分发menu按键的方法
/**
* Called to process key events. You can override this to intercept all
* key events before they are dispatched to the window. Be sure to call
* this implementation for key events that should be handled normally.
*
* @param event The key event.
*
* @return boolean Return true if this event was consumed.
*/
public boolean dispatchKeyEvent(KeyEvent event)
onUserInteraction();
// Let action bars open menus in response to the menu key prioritized over
// the window handling it
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU &&
mActionBar != null && mActionBar.onMenuKeyEvent(event))
//当menu按键到来时,先判断下actionBar是否为null,如果actionbar不为空再进行处理,即让actionbar响应按键事件
return true;
Window win = getWindow();//获取到当前activity的窗口实例
if (win.superDispatchKeyEvent(event))
//如果acitonbar没有对按键进行处理,则传递给activity所在窗口进行处理
return true;
View decor = mDecor;//先介绍一下,activity的布局的根节点为DecorView,在这里获取到activity的根节点
if (decor == null) decor = win.getDecorView();
//如果actionbar没有处理event,window窗口也没处理或者拦截event,则传递给view进行处理
return event.dispatch(this, decor != null
? decor.getKeyDispatcherState() : null, this);
处理分发按键事件时会调用,用户也可以自己覆写,来达到按自己的意愿处理按键事件的目的,比如拦截按键传递给窗口,view等。
通过以上方法的分析可以总结出,一个menu事件在传递给activity后,如果不是menu事件就会直接交给window会向下传递,有三方可能进行处理
actionbar
window
view
这三个优先级由高到低,也就是说,menu事件会首先传递给actionbar,如果actionbar进行了处理并且将事件拦截下来不派发给窗口,那么menu事件到actionbar处理之后就结束了。反之则会向window和view进行传递。
2,流程中第二个值得分析的就在ActionMenuPresenter.java中
/**
* Display the overflow menu if one is present.
* @return true if the overflow menu was shown, false otherwise.
*/
public boolean showOverflowMenu()
if (mReserveOverflow && !isOverflowMenuShowing() && mMenu != null && mMenuView != null &&
mPostedOpenRunnable == null && !mMenu.getNonActionItems().isEmpty())
//if条件进行了以下几个判断,mReserveOverflow判断了是否显示overflow按钮,isOverflowMenuShowing表示了菜单项的popupwindow是否正在显示
//,以及要打开菜单项的进程是否已经初始化,菜单项是否不是空
//初始化popupwindow对象
OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true);
开启线程,加载popupwindow
mPostedOpenRunnable = new OpenOverflowRunnable(popup);
// Post this for later; we might still need a layout for the anchor to be right.
((View) mMenuView).post(mPostedOpenRunnable);
// ActionMenuPresenter uses null as a callback argument here
// to indicate overflow is opening.
super.onSubMenuSelected(null);
return true;
return false;
总结下来就是,该方法先对一些必要的条件做了一些判断,比如menu是否存在,menu菜单选项是否为空,menu的popup是否已经弹出,或者正在弹出,然后在进行popup对象的实例化,并开启加载popup的线程。
private class OpenOverflowRunnable implements Runnable
private OverflowPopup mPopup;
public OpenOverflowRunnable(OverflowPopup popup)
mPopup = popup;
public void run()
mMenu.changeMenuMode();
final View menuView = (View) mMenuView;
if (menuView != null && menuView.getWindowToken() != null && mPopup.tryShow())
mOverflowPopup = mPopup;
mPostedOpenRunnable = null;
在加载线程中修改menu的状态模式,并且试着去弹出popup,mPopup.tryShow();
到这里menu按下从activity分发到popup的弹起就分析完了
android6.0源码分析之cameraapi2.0下的video流程分析
android6.0源码分析之CameraAPI2.0简介android6.0源码分析之Camera2HAL分析android6.0源码分析之CameraAPI2.0下的初始化流程分析android6.0源码分析之CameraAPI2.0下的Preview(预览)流程分析android6.0源码分析之CameraAPI2.0下的Capture流程分析android6.0源码分... 查看详情
android6.0源码分析之蓝牙显示接收到的文件(代码片段)
在蓝牙界面有个menu:显示接收到的文件。本文分析显示接收到的文件chapterone---显示接收到的文件/android/packages/apps/Settings/src/com/android/settings/bluetooth/文件夹下的BluetoothSettings.java开始分析caseMENU_ID_SHOW_RECEIVED:MetricsLogger.a 查看详情
android6.0源码分析之cameraapi2.0下的capture流程分析
...ture(拍照)流程进行分析。Camera2相关文章的目录如下:android6.0源码分析之CameraAPI2.0简介android6.0源码分析之Camera2HAL分析android6.0源码分析之CameraAPI2.0下的初始化流程分析android6.0源码分析之 查看详情
cameraapi2.0的应用
android6.0源码分析之CameraAPI2.0简介android6.0源码分析之Camera2HAL分析android6.0源码分析之CameraAPI2.0下的初始化流程分析android6.0源码分析之CameraAPI2.0下的Preview(预览)流程分析android6.0源码分析之CameraAPI2.0下的Capture流程分析android6.0源码分... 查看详情
cameraapi2.0的应用
android6.0源码分析之CameraAPI2.0简介android6.0源码分析之Camera2HAL分析android6.0源码分析之CameraAPI2.0下的初始化流程分析android6.0源码分析之CameraAPI2.0下的Preview(预览)流程分析android6.0源码分析之CameraAPI2.0下的Capture流程分析android6.0源码分... 查看详情
android6.0源码分析之cameraapi2.0下的preview(预览)流程分析
本文将基于android6.0的源码,对CameraAPI2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之CameraAPI2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进行了详细的分析,而在open过程中,定... 查看详情
android6.0源码分析之cameraapi2.0下的preview(预览)流程分析
本文将基于android6.0的源码,对CameraAPI2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之CameraAPI2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进行了详细的分析,而在open过程中,定... 查看详情
android6.0源码分析之cameraapi2.0下的capture流程分析
...ture(拍照)流程进行分析。Camera2相关文章的目录如下:android6.0源码分析之CameraAPI2.0简介android6.0源码分析之Camera2HAL分析android6.0源码分析之CameraAPI2.0下的初始化流程分析android6.0源码分析之CameraAPI2.0下的Preview(预览)流程分析android... 查看详情
android6.0源码分析之蓝牙框架简介
待续 查看详情
android6.0源码分析之蓝牙框架简介
待续 查看详情
android6.0源码分析之camera2hal分析
...的初始化等相关流程。以下是Camera2的相关文章目录:android6.0源码分析之CameraAPI2.0简介android6.0源码分析之Camera2HAL分析android6.0源码分析之CameraAPI2.0下的初始化流程分析android6.0源码分析之CameraAPI2.0下的Preview(预览)流程分析android... 查看详情
android6.0源码分析之ams服务源码分析
activitymanagerservice服务源码分析1、ActivityManagerService概述ActivityManagerService(以下简称AMS)作为android中最核心的服务,主要负责系统的四大组件的启动、切换、调度以及应用进程的管理和调度等工作。它类似于操作系统中的进程管... 查看详情
android6.0源码分析之zygote进程分析
在android6.0源码分析之Runtime的初始化一文中,对Zygote进程的初期的Runtime初始化过程进行了分析,在Runtime启动结束后,会对Zygote进程进行初始化,其它Java进程都需要从Zygote进程来fork,而Zygote的初始化是从ZygoteIn... 查看详情
android6.0源码分析之cameraapi2.0下的初始化流程分析
...CameraAPI2.0的框架以及代码做了简单介绍,本文将基于android6.0源码,分析CameraAPI2.0下的Camera2内置应用中,对Camera的初始化的流程分析,主要涉及CameraHAL3.0,Java层的IPCBinder 查看详情
android6.0源码分析之录音功能(代码片段)
从现在开始一周时间研究录音,下周出来一个完整的博客,监督,激励!!!2017-02-09--------2017-02-17------------------------------------------------------------------------------------------------ 查看详情
android6.0源码分析之activity启动过程
Activity最为android开发者最熟悉的组件,由ActivityManagerService服务进行调度管理,而ActivityManagerService的启动过程在activitymanagerservice服务源码分析一文中进行了详细分析,本文基于其对Activity的启动过程进行分析,同... 查看详情
android6.0源码分析之runtime的初始化
android源码分析之Runtime的初始化android运行时作为android架构的一部分,起着非常重要的作用,它和核心库(CoreLibraries)组成了Android运行时库层。本文将依据android源码对AndroidRuntime(android运行时)的建立过程进行分析。1、Android... 查看详情
android2.1的源码分析之长按电源键弹出对话框功能修改
...三个功能,请教各位高手2个问题:1、控制这个对话框的源码在哪儿?(好像不是powerdialog.java,像是globalactions.java,但我不确定);2、控制静音的代码,如何改动使之在选择静音模式后关闭震动(google自带的源码是只关掉声音,震... 查看详情