Android,启动,生命周期,binder,事件分发,绘制,activity-window-view

启动模式

singleTask
singleInstance
singleTop
standard

生命周期

onCreate
onStart 可见不可交互
onResume 可见可交互
onPause 持久化操作
onStop
onRestart
onDestory
onSaveInstanceState 执行时机,系统行为杀死APP的时候会调用,给APP一个保存状态的时机,用户主动杀死时候不会调用。
对比:
onSaveInstanceState 只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
onSaveInstanceState

Binder机制

解决什么问题,两个进程之间交互数据。
两个进程都是建立Android底层Linux操作系统上的虚拟机进程。
两个进程间交互,可以用到的方案有:

  1. 共享内存 用到内存映射,用户态到内核态的转换。
  2. 管道 读写同一个文件。
  3. 套接字,基于TCP/IP协议,socket即是一种特殊的文件,可以控制读写

Binder机制

  1. 基于共享内存的,这个内存在内核中,需要通过内存映射mmap来读写。
  2. 基于Binder驱动建立了Client Server模式的架构,提供ServiceManager来服务进程,提供服务的进程向ServiceManager注册服务,需要读数据的进程向ServiceManager访问服务。

Service生命周期

非绑定:
onCreate 只一次
onStartCommand
onDestory
绑定:
onCreate
onBind
onUnBind
onDestory
startService
stopService
bindService
unBindService

事件分发

dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
onTouch

// ViewGroup的dispatchTouchEvent

public boolean dispatchTouchEvent(MotionEvent ev) {
    if (!onInterceptTouchEvent(ev)) {
        return child.dispatchTouchEvent(ev);    //不拦截,则传给子View进行分发处理
    } else {
        return onTouchEvent(ev);    //拦截事件,交由自身对象的onTouchEvent方法处理
    }
}

// View的dispatchTouchEvent

// View中该方法的核心部分伪代码
public boolean dispatchTouchEvent(MotionEvent ev) {
    //如果该对象的监听成员变量不为空,则会调用其onTouch方法,
    if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
        return true;    //若onTouch方法返回TRUE,则表示消费了该事件,则dispachtouTouchEvent返回TRUE,让其调用者知道该事件已被消费。
    }
    return onTouchEvent(ev);    //若监听成员为空或onTouch没有消费该事件,则调用对象自身的onTouchEvent方法处理。

}

理解Activity,View,Window三者关系

  1. 三者有啥管理关系?
  2. 在UI显示上有啥关联?
  3. 初始化上,销毁上有啥关系?
  4. 消息传递上有啥关系?
  5. 架构层面有啥关系?

原理:

  1. Activity管理View和Window,WindowManager管理View在Window上的显示。Activity包含了一个PhoneWindow, 而PhoneWindow就是继承于Window的,Activity通过setContentView将View 设置 PhoneWindow上,而View通过WindowManager 的addView()、removeView()、updateViewLayout()对View进行管理。
  2. view最终显示在Window上
  3. Window的添加过程以及Activity的启动流程都是一次IPC的过程。Activity的启动需要通过AMS完成;Window的添加过程需要通过WindowSession完成。

View测量绘制

测量模式:
UNSPECIFIED
EXACTLY
AT_MOST

场景:

  1. 对于普通的 View,它的 MeasureSpec 由父视图的 MeasureSpec 和其本身的 LayoutParams 共同决定。
  2. 当父视图的MeasureSpec是AT_MOST,本身LayoutParams是Wrap_Content还是Mach_parent,都是AT_MOST。
  3. 当父视图的MeasureSpec是EXACTLY,本身LayoutParams是Wrap_Content,就是AT_MOST,本身LayoutParams是Mach_parent,就是EXACTLY

测量流程
ViewGrop测量流程

  1. 遍历MeasureChild
    过程:getChildMeasureSpec
    它用于将父布局传递来的MeasureSpec和其子view的LayoutParams,整合为一个最有可能的子View的MeasureSpec
    调用:child.measure(childWidthMeasureSpec, childHeightMeasureSpec)
  2. measure自身
    onMeasure(根据所有子view的宽高计算自己的宽高,例如ListView,AT_MOST模式计算高度就是统计所有子View高累加和)
  3. setMeasuredDimension
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值