Android面试记录

2023年 10月 12日 76.3k 0

1、Android系统架构图

从上到下依次分为四层:

  • Android应用框架层
  • Java系统框架层
  • C++系统框架层
  • Linux内核层

2、Service的生命周期、启动方法、与Activity通信

启动方法

  • startService():开启Service,调用者退出后Service仍然存在。
  • bindService():开启Service,调用者退出后Service也随即退出。

生命周期

  • 只是用startService()启动服务:onCreate() -> onStartCommand() -> onDestory
  • 只是用bindService()绑定服务:onCreate() -> onBind() -> onUnBind() -> onDestory
  • 同时使用startService()启动服务与bindService()绑定服务:onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory

与Activity通信

可以通过bindService的方式,先在Activity里实现一个ServiceConnection接口,并将该接口传递给bindService()方法,在ServiceConnection接口的onServiceConnected()方法里执行相关操作。

3、广播BroadcastReceiver

应用场景

  • 普通广播:调用sendBroadcast()发送,最常用的广播。
  • 有序广播:调用sendOrderedBroadcast(),发出去的广播会被广播接受者按照顺序接收,广播接收者按照Priority属性值从大-小排序,Priority属性相同者,动态注册的广播优先,广播接收者还可以选择对广播进行截断和修改。

注册方式

  • 静态注册:常驻系统,不受组件生命周期影响,即便应用退出,广播还是可以被接收,耗电、占内存。
  • 动态注册:非常驻,跟随组件的生命变化,组件结束,广播结束。在组件结束前,需要先移除广播,否则容易造成内存泄漏。

发送和接收的原理

  • 继承BroadcastReceiver,重写onReceive()方法。
  • 通过Binder机制向ActivityManagerService注册广播。
  • 通过Binder机制向ActivityManagerService发送广播。
  • ActivityManagerService查找符合相应条件的广播(IntentFilter/Permission)的BroadcastReceiver,将广播发送到BroadcastReceiver所在的消息队列中。
  • BroadcastReceiver所在消息队列拿到此广播后,回调它的onReceive()方法。
  • 4、ContentProvider、ContentResolver与ContentObserver之间的关系

    • ContentProvider:管理数据,提供数据的增删改查操作,数据源可以是数据库、文件、XML、网络等,ContentProvider为这些数据的访问提供了统一的接口,可以用来做进程间数据共享。
    • ContentResolver:ContentResolver可以不同URI操作不同的ContentProvider中的数据,外部进程可以通过ContentResolver与ContentProvider进行交互。
    • ContentObserver:观察ContentProvider中的数据变化,并将变化通知给外界。

    5、Android的事件分发机制

    Android事件分发机制的本质:事件从哪个对象发出,经过哪些对象,最终由哪个对象处理了该事件。此处对象指的是Activity、Window与View。

    Android事件的分发顺序:Activity(Window) -> ViewGroup -> View

    Android事件的分发主要由三个方法来完成,如下所示:

    // 父View调用dispatchTouchEvent()开始分发事件
    public boolean dispatchTouchEvent(MotionEvent event){
        boolean consume = false;
        // 父View决定是否拦截事件
        if(onInterceptTouchEvent(event)){
            // 父View调用onTouchEvent(event)消费事件,如果该方法返回true,表示
            // 该View消费了该事件,后续该事件序列的事件(Down、Move、Up)将不会在传递
            // 该其他View。
            consume = onTouchEvent(event);
        }else{
            // 调用子View的dispatchTouchEvent(event)方法继续分发事件
            consume = child.dispatchTouchEvent(event);
        }
        return consume;
    }
    

    Android事件处理优先级 OnTouchListener > onTouchEvent > onClickListener

    首先,取出 mListenerInfo 属性保存的监听信息,检查它的 mOnTouchListener 变量不为空、并且当前 View 是否处于启用状态(Flag == ENABLED),并且 mOnTouchListener 的 onTouch 方法返回了 true ,说明当前 View 的 onTouch 处理了事件,事件到此为止,分发结束。

    onTouch 优先调用的作用是在向 View 发送触摸事件时调用。这让 mOnTouchListener 有机会在交给目标视图处理之前做出响应。

    如果 onTouch 方法返回了 false ,没有消耗事件,那么将调用当前 View 的 onTouchEvent 方法来处理事件。

    onTouchEvent(MotionEvent) 是 View 用来开始处理触摸运动事件的方法,如果使用此方法检测单击行为,建议通过实现并调用performClick()来执行这些操作。这样能够保证一些系统行为的一致性,包括:

    • 调用 onClickListener
    • 无障碍处理 ACTION_CLICK 事件
    • 触发系统点击音效

    View 的 onTouchEvent 方法中处理了单击、长按、UI 的按压状态等逻辑,内部通过调用 performClickInternal() 来触发点击事件。

        private boolean performClickInternal() {
            // Must notify autofill manager before performing the click actions to avoid scenarios where
            // the app has a click listener that changes the state of views the autofill service might
            // be interested on.
            notifyAutofillManagerOnClick();
    
            return performClick();
        }
    

    针对正在处理事件的View而言,如果后续事件不再由其处理,即其失去了事件处理焦点,则会向该View分发ACTION_CANCEL事件用于标记事件结束。

    www.kancloud.cn/aslai/inter…

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论