皮皮网

【电台源码】【龙禅公式源码】【群晖主页源码】phonewindow 源码

2024-12-28 19:08:58 来源:绝代双雄toggle源码

1.车机开发【Android SystemUI 架构音量控制详解】
2.Android中View的创建过程
3.android onTouchEvent和setOnTouchListener中onTouch的区别

phonewindow 源码

车机开发【Android SystemUI 架构音量控制详解】

       在Android系统中,SystemUI是一个特殊的应用,尽管它的源代码形式类似于普通应用,但它以独特的存在方式运行在系统内部。这个模块以APK文件的形式存在,位于`frameworks/base/packages/SystemUI/`目录下,电台源码并安装在`system/priv-app/-SystemUI`路径中。尽管它是一个应用,但它的界面和功能设计使得用户在使用过程中难以将其视为一个传统应用。

       SystemUI的核心功能包括提供系统控制界面,例如音量控制、通知管理等。其中,龙禅公式源码音量控制模块(VolumeUI)在用户操作音量键时负责提供相应的用户界面,并允许设置音量大小和情景模式。VolumeUI的代码主要集中在`SystemUI/volume`目录下,不同模式下音量键触发的UI显示样式会有所不同,包括通话、铃声(通知)、群晖主页源码音乐、闹铃、蓝牙输出等。

       当音量键触发时,VolumeUI通过系统服务启动,主要经过初始化过程,爱窝影视源码包括读取配置、实例化UI控件、创建VolumeController控制器等步骤。初始化过程中的关键步骤包括实例化`VolumePanel`,这是一个`Handler`的子类,负责UI的手机延保源码绘制和控制。此过程以Dialog的形式显示UI,确保UI的交互性。`VolumePanel`同时继承了`VolumeUI`的`Pannel`,因此,它不仅负责显示,还控制了UI的显示和关闭。

       VolumeUI的架构展示了如何在不同模式下控制音量。当非活动窗口接收到音量键事件时,这些事件通常在`Window`中被处理。系统通过Binder机制将事件信息传递给`MediaSessionService`,然后传递给`AudioService`,最后到达`SystemUI`的`VolumeUI`部分,使得音量控制响应用户操作。

       在具体的音量控制过程中,当活动窗口为Launcher桌面时,音量键事件在`PhoneWindow`中被处理。事件分发到`onKeyUp()`和`onKeyDown()`方法,调用`sendAdjustVolumeBy()`方法来调整音量。这些事件最终传递到`MediaSessionService`,进一步通过Binder机制到达`AudioService`,完成音量调整的过程。

       总结整个流程,从音量键触发到UI显示和关闭,涉及到多个系统服务和进程之间的通信。通过Binder机制确保了不同组件之间的高效通信和控制。整个控制过程直观且高效,为用户提供了一致且响应迅速的音量控制体验。

Android中View的创建过程

        我们知道在onCreate里面View还是没有测绘完成的。那么什么时候测绘完成了?答案是onResume。

        通过查看源码 我们可以看到在onCreate方法里面调用了getWindow()方法然后在将我们的页面塞到这个window里面。这个window也就是PhonwWindow.

        那PhoneWindow是什么时候被创建的?

        这就引出了Activity的创建流程。

那Activity是怎么被创建的呢?

        由于Activity是一个组件他是由系统使用ActivityThread方法去创建的。

        现在我来分析下:

        先来到ActivityThread类的handleLaunchActivity方法。

        可以看到他去调用了Activity的performCreate方法。

        现在我们终于看到onCreate方法被调用了。

        这里还有个重点,在performLaunchActivity里面去调用Activity的onCreate方法之前还去做了一件很重要的事情,这个事情在第行:调用了Activity的attach方法。

        现在跟到Activity的attach方法:找到了我们一直找的PhoneWindow的创建。

android onTouchEvent和setOnTouchListener中onTouch的区别

       è§¦æ‘¸äº‹ä»¶åˆ†å‘机制,好好看看;

       /blog/

       Android中的事件分为按键事件和触摸事件,这里对触摸事件进行阐述。Touch事件是由一个ACTION_DOWN,n个

       ACTION_MOVE,一个ACTION_UP组成onClick,onLongClick,onScroll等事件。Android中的控件都是继承

       View这个基类的,而控件分为两种:一种是继承View不能包含其他控件的控件;一种是继承ViewGroup可以包含其他控件的控件,暂且称为容器控

       ä»¶ï¼Œæ¯”如ListView,GridView,LinearLayout等。

       è¿™é‡Œå…ˆå¯¹å‡ ä¸ªå‡½æ•°è®²è§£ä¸‹ã€‚

       Ø public boolean dispatchTouchEvent (MotionEventev) 这个方法分发TouchEvent

       Ø public booleanonInterceptTouchEvent(MotionEvent ev) 这个方法拦截TouchEvent

       Ø public boolean onTouchEvent(MotionEvent ev) 这个方法处理TouchEvent

       å…¶ä¸­view类中有dispatchTouchEvent和onTouchEvent两个方法,ViewGroup继承View,而且还新添了一个

       onInterceptTouchEvent方法。Activity中也无onInterceptTouchEvent方法,但有另外两种方法。我们可以

       å‘现上面3个方法都是返回boolean,那各代表什么意思呢?

        public boolean dispatchTouchEvent (MotionEvent ev)

        Activity中解释:

       Called to process touch screen

       events.You can override this to intercept all touch screen events before

        they aredispatched to the window. Be sure to call this implementation

       for touch screenevents that should be handled normally.

       Parameters

       ev

       The touch screen event.

       Returns

       Â· boolean Return true if this event was consumed.

       å®ƒä¼šè¢«è°ƒç”¨å¤„理触摸屏事件,可以重写覆盖此方法来拦截所有触摸屏事件在这些事件分发到窗口之前。通常应该处理触摸屏事件,一定要调用这个实现。当返

       å›žå€¼ä¸ºtrue时,表示这个事件已经被消费了。例如在TextActivity中dispatchTouchEvent在ACTION_MOVE返回

       true,运行结果如下:

       ä¹Ÿå°±æ˜¯å®ƒå¹¶æ²¡æœ‰æŠŠé‚£ACTION_MOVE分发下去。

       public boolean onInterceptTouchEvent (MotionEvent ev)

       Implementthis

        method to intercept all touch screen motion events. This allows you

       towatch events as they are dispatched to your children, and take

       ownership of thecurrent gesture at any point.

       Usingthis function takes some care, as it has a fairly complicated interaction with View.onTouchEvent(MotionEvent),and

        using it requires implementing that method as well as this one in

       thecorrect way. Events will be received in the following order:

       1. You will receive the down event here.

       2. The

        down event will be handled either by a child of this viewgroup, or

       given to your own onTouchEvent() method to handle; this means youshould

       implement onTouchEvent() to return true, so you will continue to see

       therest of the gesture (instead of looking for a parent view to handle

       it). Also,by returning true from onTouchEvent(), you will not receive

       any followingevents in onInterceptTouchEvent() and all touch processing

       must happen inonTouchEvent() like normal.

       3. For

        as long as you return false from this function, eachfollowing event (up

        to and including the final up) will be delivered first hereand then to

       the target's onTouchEvent().

       4. If

        you return true from here, you will not receive any followingevents:

       the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to youronTouchEvent() method and no longer appear here.

       Parameters

       ev

       The motion event being dispatched down the hierarchy.

       Returns

       Â· Return

        true to steal motionevents from the children and have them dispatched

       to this ViewGroup throughonTouchEvent(). The current target will receive

        an ACTION_CANCEL event, and nofurther messages will be delivered here.

       åŸºæœ¬æ„æ€å°±æ˜¯ï¼š

       1. ACTION_DOWN首先会传递到onInterceptTouchEvent()方法

       2.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。

       3.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。

       4.如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。

       5.如果最终需要处理事件的view的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。

       Android touch事件传递机制:

       æˆ‘们可以看看android源代码:

       Activity.java中

       æš‚且不管onUserInteraction方法因为它只是一个空方法如果你没实现的话。getWindow().superDispatchTouchEvent(ev)。其中getWindow()返回的是PhoneWindow。

       PhoneWindow.java:

       æ­¤å‡½æ•°è°ƒç”¨super.dispatchTouchEvent(event),Activity的rootview是

       PhoneWindow.DecorView,它继承FrameLayout。通过super.dispatchTouchEvent把touch事件派

       å‘给各个Activity的是子view。同时我可以看到,如果子view拦截了事件,则不会执行onTouchEvent函数。

       ViewGroup.java中dispatchTouchEvent方法:

       ç”±äºŽä»£ç è¿‡é•¿è¿™é‡Œå°±ä¸è´´å‡ºæ¥äº†ï¼Œä½†ä¹ŸçŸ¥é“它返回的是

       return target.dispatchTouchEvent(ev);

       è¿™é‡Œtarget指的是所分发的目标,可以是它本身,也可以是它的子View。

       ViewGroup.java中的onInterceptTouchEvent方法:

       é»˜è®¤æƒ…况下返回false。即不拦截touch事件。

       View.java中的dispatchTouchEvent方法

       è¿™é‡Œæˆ‘们很清楚可以知道如果if条件不成立则dispatchTouchEvent的返回值是onTouchEvent的返回值

       View.java中的onTouchEvent方法