您的位置:首页 > 数码常识数码常识

android提供了哪两种启动activity的方式(androidactivity启动)

2025-05-11人已围观

android提供了哪两种启动activity的方式(androidactivity启动)
  要解决这几个问题启动过程分几步每一步解决什么问题进程怎么创建的栈怎么维护的LanchMode怎么实现的4次IPC过程当前App Activity 发起startactivity->ActivityManagerServiceAMS->原App Activity 进行暂停原Activity -> AMS 已经暂停AMS ->通知新activity 开始启动相关类ActivityThread:App启动的入口ApplicationThread:ActivityThread的内部类,继承Binder,可以进程跨进程通信。ApplicationThreadProxy:ApplicationThread的一个本地代理,其它的client端通过这个对象调用server端ApplicationThread中方法。Instrumentation:负责发起Activity的启动、并具体负责Activity的创建以及Activity生命周期的回调。一个应用进程只会有一个Instrumentation对象,App内的所有Activity都持有该对象的引用。ActivityManagerService:简称AMS,是service端对象,负责管理系统中所有的ActivityActivityManagerProxy:是ActivityManagerService的本地代理ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。ActivityRecord:ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。TaskRecord:AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。启动过程分析

  androidactivity启动要解决这几个问题启动过程分几步每一步解决什么问题进程怎么创建的栈怎么维护的LanchMode怎么实现的4次IPC过程当前App Activity 发起startactivity->ActivityManagerServiceAMS->原App Activity 进行暂停原Activity -> AMS 已经暂停AMS ->通知新activity 开始启动相关类ActivityThread:App启动的入口ApplicationThread:ActivityThread的内部类,继承Binder,可以进程跨进程通信。ApplicationThreadProxy:ApplicationThread的一个本地代理,其它的client端通过这个对象调用server端ApplicationThread中方法。Instrumentation:负责发起Activity的启动、并具体负责Activity的创建以及Activity生命周期的回调。一个应用进程只会有一个Instrumentation对象,App内的所有Activity都持有该对象的引用。ActivityManagerService:简称AMS,是service端对象,负责管理系统中所有的ActivityActivityManagerProxy:是ActivityManagerService的本地代理ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。ActivityRecord:ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。TaskRecord:AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。启动过程分析

  第一步

  startActivityForResult ,startActivity最终也是调用这个方法来启动新的Activity。然后跑到Instrumentation

  ActivityManager.getService() 拿到的是AIDL方式获取的AMS的本地对象。或者说,它可以和AMS进行通信。AMS上面说了,是所有activity的管理对象。而Instrumentation在这里就是启动新的Activity。

  从下面的代码,就是上面4步里面的第一步,从Activity到AMS。

  第二步

  第二步是AMS通知原activity pause。所以这个时候原activity需要进入task和stack。接下来看AMS启动activity的过程

  mActivityStarter是负载启动activity的辅助类。

  注释翻译过来就是:ActivityStarter这个类,启动Activity的控制器,主要用于用来将Intent和flags转换成activity和相关任务栈;ActivityStackSupervisor:主要管理着mHomeStack和mFocusedStack两个ActivityStack等相关信息;先来看ActivityStarter,整个过程有5层调用:

  从一开始的输入是intent和flags 到最后的mTargetStack,mOptionsActivityStackSupervisor 后面又调用了ActivityStack.resumeTopActivityUncheckedLocked

  这个时候需要先pause原activity。往后看,会看到ActivityThread$H.handlePauseActivity到这里就是第二步结束了。

  第三步

  AMS通知原activity pause:

  ActivityManager.getService().activityPaused(token);//执行完后通知AMS当前Activity已经pauseInstrumentation 会通知activity做onPause的回调。Instrumentation的作用就会通知Activity的生命周期。这就是第三步。ActivityThread通知AMS,pause完成了。

  第四步

  从AMS知道pause完成以后,继续流程:StackSupervisor.resumeFocusedStackTopActivityLocked

  后面会走到ActivityThread的

  然后跑到ActivityThread$H:handleLaunchActivity,然后又回到mInstrumentation,又是这个类

  哈哈,到这里,new activity已经创建,mInstrumentation call了onCreate。至此,整个页面已经创建完毕。

  流程总结

  ActivityA 启动ActivityB

  Instrumentation 向AMS发起启动B的通知。第一步结束AMS 收到通知,通过ActivityStarter开始启动的流程。ActivityStarter 把intent& flags,转化成mTargetStack,mOptions,并给到ActivityStackSupervisor(负责Activity的栈管理)ActivityStackSupervisor 开始pause A的流程。ActivityThread$H.handlePauseActivity 完成pause的流程。第二步结束。然后ActivityThread通知AMS,pause完成。第三步结束AMS 通知ActivityStackSupervisor 启动B结语

  如果有错的地方或者什么想法欢迎提出来,大家一起探讨,谢谢。

  上面就是小居数码小编今天给大家介绍的关于(androidactivity启动)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。

  94%的朋友还想知道的:

  微信聊天记录迁移教程图文(微信聊天记录有几种迁移方式)

  PS中羽化选区有哪两种操作(ps如何选区羽化)

  pdf文件多种打开方式(pdf文件用什么打开)

  遇到bin文件格式打开方式(遇到bin文件格式怎么去打开)



  151995
 

很赞哦! ()

随机图文