startActivity---->
startActivityForActivityResult----->
Insrumention(execStartActivity)--->
ActivityManagerProxy(startActivity)--->
Binder通信---->通知ActivityManagerService
A:检查Activity的合法性,是否在AndroidManifestxml清单文件中注册。
B:如果合法,会暂存Activity的信息,通过ActivityStack获取栈顶的Activity,并通知Launcher应用,pause 该Activity 。
C:检查Activity所在的进程是否存在。
A:会调用Processstart() ,通过Socket通信的方式,通知zygote进程,fork一个新进程
B:载入ActivityThread ,会调用main()方法初始化,在main()方法内部会调用 threadattach(false, startSeq)--->actachApplication()
B1:判断Application是否存在,如果存在,直接绑定当前的进程,
如果不存在,会调用LoadApkmakeApplication创建一个新的Application,并绑定当前进程。
handleLaunchActivity--->performLaunchActivity---->Instrumentation--->newActivity---->callActivityCreate---->callActivityStart--->callActivityResume----->UI渲染完成。
不用写代码。直接在cmd窗口上输入 adb shell后,再输入dumpsys activity activities,可以看到所有的activity以及相关栈状态。 查看原帖>> 采纳哦
在Android中每个界面都是一个Activity,切换界面 *** 作其实是多个不同Activity之间的实例化 *** 作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Android总Activity的启动模式分为四种:
Activity启动模式设置:
<activity android:name="MainActivity" android:launchMode="standard" />
Activity的四种启动模式:
1 standard
模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2 singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3 singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4 singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
其中standard是系统默认的启动模式。
1、MainActivity启动时创建一个静态的集合
2、每次开启一个activity就向集合插入activity的引用
3、清除的时候,只需遍历这个集合,将你不需要的activity finish掉就行了。
package netoschinaapp;
import javautilStack;
import androidappActivity;
import androidappActivityManager;
import androidcontentContext;
/
应用程序Activity管理类:用于Activity管理和应用程序退出
@author liux (>
以上就是关于App启动原理全部的内容,包括:App启动原理、如何判断栈里是否存在一个activity、如何获取activity的lunchmode等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)