Mobile

A collection of 4 posts

Mobile

Activity、Task、应用和进程

一、问题的提出 1. 谁负责管理Activity? Android的framework框架中采用C/S的方式实现由后台服务ActivityManagerService(很多书上将其简称为Ams)来管理具体的Acitivity实例,虽然Ams命名为ActivityManagerService,但是它其实不仅仅管理Activity,他还管理除Acitvity外的其它三大组件,还包括Intent、pendingintent、apk进程和task等等,具体可以查看源码frameworks\base\services\java\com\android\server\am下面的Ams源码和相关的*Record类。 网上资料显示在2.3以后的SDK中,Ams将原来的HistoryRecord类重新命名为ActivityRecord类,并将其原来Ams中的一些处理抽出来成为一个ActivityStack类,每一个Activity实例对应一个ActivityRecord对象,并存放在ActivityStack中,手机一旦启动,就会启动一个Ams服务,在Ams服务中有一个ActivityStack实例专门管理手机上的ActivityRecord实例。这样一来,不具体分析源码,仅从架构角度来说谁负责管理Activity的问题就清晰多了。 2. Task到底是什么? 根据对上面问题的解答,既然Activity是由Ams通过ActivityStack来管理的,那么这个Task又是干什么的呢? 以往基于应用(application)的程序开发中,程序具有明确的边界,

  • Sky Lan
    Sky Lan
Mobile

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

一、前言 Android中触摸事件传递过程中最重要的是**dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()**方法。这个是困扰初学者的问题之一,我开始也是。这里记录一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的处理过程,以供记忆。 二、函数功能 dispatchTouchEvent是处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的。执行super.dispatchTouchEvent(ev),事件向下分发。 onInterceptTouchEvent是ViewGroup提供的方法,默认返回false,返回true表示拦截。 onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。 View里,有两个回调函数: public boolean dispatchTouchEvent(MotionEvent ev); public boolean onTouchEvent(MotionEvent ev)

  • Sky Lan
    Sky Lan
Mobile

Activity Manager Service总结

一、涉及的主要类及解释 ActivityManagerService.java Android系统服务,Activity管理的服务端,用于管理activity的各种行为,控制activity的生命周期,派发消息事件,低内存管理等等。实现了IBinder接口,可以用于进程间通信。 ApplicationThread.java 实现了IBinder接口,activity整个框架中客户端和服务端(Ams)通信的接口。同时也是类ActivityThread的内部类。这样就有效地把Ams和ActivityThread绑在了一起。代理模式 ? 有点像。 ActivityThread.java 如第2点所述,ApplicationThread所绑定的客户端就是ActivityThread。ActivityThread这个类在Activity客户端非常重要。 * 它是应用程序的入口,众所周知,java程序的入口时 main() 方法,同样,当AMS拉起一个新的进程,同时启动一个主线程的时候,主线程就从ActivityThread.main方法开始执行,它会初始化一些对象,然后自己进入消息等待队列, 也就是Looper.loop(),一旦进入loop()方法,线程就进入了死循环,

  • Sky Lan
    Sky Lan