Activity的详情

Activity:活动,用户交互的界面。

Activtiy的启动过程:

启动activity的方式有以下几种:

  1. 在应用程序中startActivity()或startActivityForResult()方法启动指定activity
  2. 在HOME(桌面)程序中单击应用图标,启动新的activity
  3. 按"BACK"键结束当前activity,自动启动上一个activity
  4. 长按“Home”键,显示出当前任务列表,从中选择一个启动

Activity启动另一个Activity之前,当前的Activity先要执行onPause,被启动的Activity才会执行到onResume方法。这中间实际上是会执行4次IPC过程的:

  • 当前Activity发起启动另一个Activity的请求——>ActivityManagerService
  • ActivityManagerService——> 通知App暂停当前Activity
  • 当前App告知已经暂停了当前的Activity——> ActivityManagerService
  • ActivityManagerService ——> 通知App启动新的Activity

Activity启动涉及到的类

首先要简单介绍一下Activity启动过程涉及到的类,以便于更好的理解这个启动过程。

  • ActivityThread:App启动的入口
  • ApplicationThread:ActivityThread的内部类,继承Binder,可以进程跨进程通信。
  • ApplicationThreadProxy:ApplicationThread的一个本地代理,其它的client端通过这个对象调用server端ApplicationThread中方法。
  • Instrumentation:负责发起Activity的启动、并具体负责Activity的创建以及Activity生命周期的回调。一个应用进程只会有一个Instrumentation对象,App内的所有Activity都持有该对象的引用。
  • ActivityManagerService:简称AMS,是service端对象,负责管理系统中所有的Activity
  • ActivityManagerProxy:是ActivityManagerService的本地代理
  • ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
  • ActivityRecord:ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
  • TaskRecord:AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。

Activity启动最终会调用到startActivityForResult方法,我们只需要关注mParent == null中的逻辑即可。mParent代表的是ActivityGroup,其最开始是为了在一个界面中嵌入多个子Activity,在API13的时候就已经废弃了,可以使用Fragment表示一个界面的多个区域。

由startActivity()——〉startActivityForResult() ——〉execStartActivity()(Instarumentation的对象调用该方法)——〉ActivityManagerNative.getDefault()方法获取ActivityManagerService的一个本地代理对象ActivityManagerProxy,然后调用了其startActivity()——〉

  1. Activity.startActivity
  2. Activity.startActivityForResult
  3. Instrumentation.execStartActivity
  4. ActivityManagerProxy.startActivity
  5. ActivityManagerService.startActivity
  6. ActivityStack.startActivityMayWait
  7. ActivityStack.startActivityLocked
  8. ActivityStack.startActivityUncheckedLocked
  9. ActivityStack.resumeTopActivityLocked
  10. ActivityStack.startPausingLocked
  11. ApplicationThreadProxy.schedulePauseActivity
  12. ApplicationThread.schedulePauseActivity
  13. ActivityThread.queueOrSendMessage
  14. H.handleMessage
  15. ActivityThread.handlePauseActivity
  16. ActivityManagerProxy.activityPaused
  17. ActivityManagerService.activityPaused
  18. ActivityStack.activityPaused
  19. ActivityStack.completePauseLocked
  20. ActivityStack.resumeTopActivityLokced
  21. ActivityStack.startSpecificActivityLocked
  22. ActivityStack.realStartActivityLocked
  23. ApplicationThreadProxy.scheduleLaunchActivity
  24. ApplicationThread.scheduleLaunchActivity
  25. ActivityThread.queueOrSendMessage
  26. H.handleMessage
  27. ActivityThread.handleLaunchActivity
  28. ActivityThread.performLaunchActivity
  29. AcitiviyB.onCreate

 

Activity的生命周期:onCreate() ——〉onStart() ——〉onResume() ——〉onPause() ——〉onStop() ——〉onDestory() 

Activity的启动模式:standard(开启一个就创建一个Activity)、singleTop(先判断Task栈顶是否有,若有则直接返回栈顶活动,若不在栈顶还是需要重新创建新的)、singleTask(判断Task中是否存在Activity,若有则将该活动之上的所有活动全部出栈,若没有则重新创建新的)、singleInstance(创建一个单独的栈,一般用于多个程序共享一个Activity)

如何知晓当前是那个活动:创建一个Class,命名为BaseActivity,继承AppCompatActivity,并重写onCreate的方法,使用Log记录,getClass().getSimpleName(),这个类不需要再清单文件注册。然后让项目中所有的Activity继承这个类。

如何随时退出程序:创建一个管理器,管理活动ActivityCollector,使用List来存储activity对象,编写三个方法:addActivity,removeActivity,finishAll;然后在创建一个继承AppCompatActivity的BaseActivity来调用,在onCreate方法调用ActivityCollector.addActivity,在onDestory方法调用ActivityCollector.removeActivity的方法,若要在指定的Activity中退出程序,可调用ActivityCollector.finishAll的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值