浅谈桌面启动一个应用Activity
来源:互联网 发布:手机端淘宝首页的模板 编辑:程序博客网 时间:2024/06/03 08:32
startActivity
1、Launcher进程
Handler机制在主线程循环处理消息,在onCreate时调用了startActivity,通过Binder进程间通信机制发送了START_ACTIVITY_TRANSATION。
START_ACTIVITY_TRANSATION:异步请求,发送完Launcher进程睡觉等待在主线程。
2、SystemServer
SystemServer线程向Launcher主线程发送SCHEDULE_PAUSE_ACTIVITY_TRANSACTION(通过ApplicationThreadProxy),之所以选择Launcher主线程,是因为Launcher主线程正在等待SystemServer的返回数据。这个过程是同步的,只发送不等待返回结果。
之后SystemServer线程向Launcher主线程发送了START_ACTIVITY_TRANSATION的返回结果。
3、Launcher进程
Launcher进程此时需要处理两个返回命令,一个是BR_TRANSATION(发送SCHEDULE_PAUSE_ACTIVITY_TRANSACTION),一个是BR_REPLY(START_ACTIVITY_TRANSATION的返回结果)。
status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) { int32_t cmd; int32_t err; while (1) { if ((err=talkWithDriver()) < NO_ERROR) break; err = mIn.errorCheck(); if (err < NO_ERROR) break; if (mIn.dataAvail() == 0) continue; cmd = mIn.readInt32();//读取了BR_TRANSACTION_COMPLETE协议,mIn中就没有数据了 ..... switch (cmd) { case BR_TRANSATION: .... break; case BR_REPLY: .... break; ..... } ........ return err; }
先处理BR_TRANSATION,向主线程的Handler发送了H.PAUSE_ACTIVITY,此时由于onCreate在主线程中执行,所以这个命令还不能马上执行。
再处理BR_REPLY,退出onCreate,继续执行Handler里面的内容H.PAUSE_ACTIVITY。向SystemServer发送ACTIVITY_PAUSED_TRANSACTION,异步请求,要求等待返回值。主线程继续睡眠等待返回值。
4、SystemServer
SystemServer线程会执行Process.start,来请求Zygote fork出一个新的进程,新进程入口地址ActivityThread.main。然后SystemServer继续运行,给Launcher主线程发送返回值。
5、应用程序进程
从入口ActivityThread.main继续执行,此时子线程用来处理binder进程间通信,在handleChildProc-->zygoteInit已经建立了。但是此时Handler主线程循环机制并未建立。
public final class ActivityThread { ...... public static final void main(String[] args) { SamplingProfilerIntegration.start(); Process.setArgV0("<pre-initialized>"); Looper.prepareMainLooper(); if (sMainThreadHandler == null) { sMainThreadHandler = new Handler(); } ActivityThread thread = new ActivityThread(); thread.attach(false); if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } Looper.loop(); if (Process.supportsProcesses()) { throw new RuntimeException("Main thread loop unexpectedly exited"); } thread.detach(); String name = (thread.mInitialApplication != null) ? thread.mInitialApplication.getPackageName() : "<unknown>"; Slog.i(TAG, "Main thread of " + name + " is now exiting"); } ...... }应用程序主线程向SystemServer发送ATTACH_APPLICATION_TRANSACTION,异步请求,在主线程睡眠等待。
6、SystemServer
SystemServer有一个线程来处理进程间通信请求,通过ApplicationTheadProxy向应用程序主线程发送BIND_APPLICATION_TRANSATION和SCHDULE_LAUNCH_ACTIVITY_TRANSATION同步请求。之所有选择应用程序主线程,是因为他正在等待SystemServer的返回数据,不用白不用。
之后再想应用程序主线程发送返回数据。
7、应用程序进程
应用程序主线程被唤醒,需要处理两个BR_TRANSATION,一个BR_REPLY。
status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) { int32_t cmd; int32_t err; while (1) { if ((err=talkWithDriver()) < NO_ERROR) break; err = mIn.errorCheck(); if (err < NO_ERROR) break; if (mIn.dataAvail() == 0) continue; cmd = mIn.readInt32();//读取了BR_TRANSACTION_COMPLETE协议,mIn中就没有数据了 ..... switch (cmd) { case BR_TRANSATION: .... break; case BR_REPLY: .... break; ..... } ........ return err; }先处理两个BR_TRANSATION,分别向主线程Handler发送两个消息,由于目前Handler机制尚未建立完成,待处理完BR_REPLY主线程继续执行Looper.loop时,会执行。也就是应用程序进程的Application类的onCreate的方法和Activity类的onCreate方法会执行。
- 浅谈桌面启动一个应用Activity
- 四种方法启动一个应用(activity)
- 浅谈Activity启动模式
- 浅谈Activity启动顺序
- android之启动桌面activity
- 浅谈Activity的启动模式
- Android应用开发学习笔记之启动另外一个Activity
- 如何启动另外一个应用的任意Activity
- android:activity:启动一个activity
- 1 启动一个Activity
- 启动另外一个Activity
- android 启动一个activity
- Training--启动一个Activity
- 启动另外一个Activity
- 启动一个Activity
- 再启动一个Activity
- 启动一个Activity
- Intent启动一个Activity
- UVA
- MySQL中常见的字符串处理函数
- java,js,jQuery字符串去空格
- 关于Python安装图像库PIL的方案
- MFC(VC,C++)下,OCX内使用另外一个OCX方法(内嵌OCX)-《零度屏幕录像软件》之笔记一
- 浅谈桌面启动一个应用Activity
- 11muduo_base库源码分析(二)
- spring boot 常用注解解析
- 自动装箱和自动拆箱
- java.io.IOException: java.lang.reflect.InvocationTargetException at org.apache.hadoop.hbase.client.
- AngularJS ng依赖注入的三种方式
- 算法题练习系列之(二十): 打印沙漏
- 黑马和尚学堂如何选?我在朝着IT大神的方向努力着
- ASP cookies页面判断代码