android_Activity

原创
2014/11/14 10:45
阅读数 91
Activity的生命周期

Activity四种启动模式

1.Standared(默认)激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例

       2.SingleTop这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

       3.SingleTask如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

       4.SingleInstance当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity

Activity两种启动方式

        显式:户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity

隐式:内部通过调用startActvity接口启动新的Activity,隐式启动可以使得Activity之间的藕合性更加松散  MainActivity不需要知道SubActivity的存在,即它不直接拥有SubActivity的接口,但是它可以通过一个字符串来告诉应用程序框架层,它要启动的Activity的名称是什么,其它的事情就交给应用程序框架层来做,当然,应用程序框架层会根据这个字符串来找到其对应的Activity,然后把它启动起来。这样,就使得Android应用程序中的Activity藕合性很松散,从而使得Android应用程序的模块性程度很高

Activty启动流程

启动新的Activity需要借助于应用程序框架层的ActivityManagerService服务进程  ActivityManagerService和ActivityStack位于同一个进程中,ApplicationThread和ActivityThread位于另一个进程中,  ActivityManagerService是负责管理Activity的生命周期的,ActivityManagerService还借助ActivityStack是来把所有的 Activity按照后进先出的顺序放在一个堆栈中,ActivityThread来表示应用程序的主进程,而每一个ActivityThread都包含有一 个ApplicationThread实例,它是一个Binder对象,负责和其它进程进行通信

     1. 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口; 

     2. ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;

     3. ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;

     4. ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;

    5. 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;

    6. ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;

    7. ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。


Activity显示窗口样式

清单文件activity中android:theme="@android :style/Theme.Dialog"

<item name="android:windowBackground">@android :color/transparent</item>窗口背景色

<item name="android:windowFrame">@null</item>DialogwindowFrame框为无

<item name="android:windowIsFloating">true</item>是否浮现在activity之上

<item name="android:windowIsTranslucent">true</item>窗口是否半透明——是(与第一条配合使用)

<item name="android:windowAnimationStyle">@android :style/Animation.Dialog</item>窗口弹出效果

<item name="android:backgroundDimEnabled">true</item> 是否允许背景模糊

<item name="android:windowContentOverlay">@null</item>这个不设置的话,可能会出现边框黑线




展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部