- Activity类定义出来后, 何时实例化,方法何时调用都有Android系统决定
- Activity的exported属性为ture时,表明这个activity可以被其他应用调用
- 不能再activity的onCreate方法中获取控件的宽度和高度,因为此时控件还没有完成度量
- 在Activity的声明周期中有四个重要状态:
- Activity启动其他Activity的两种方法:
- startActivity(Intent intent):启动其他Activity
- startActivityForResult(Intent intent,int requestCode):以指定的请求码启动Acitvity,而且程序将会等到新启动的Activity的结果,通过重写onActivityResult(int requestCode,int resultCOde,Intent intent)方法来获取,其中requestCode代表请求码,resultCode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。被启动的Activity需要调用setResult()方法设置处理结果
- Activity A启动Activity后,Activity A会变成停止状态,但系统会保存它的状态,比如activity中的滚动条位置或者表单中输入的文本数据,当用户按下后退按钮时,ActivityB从栈中弹出销毁,Activity A得以恢复保存的状态,另外Activitie可以被多次实例化,即使是从另外的task.
- 当activity变为暂停或停止状态时,该activity可能被系统销毁(内存不足或者屏幕旋转等原因),为了保存activity的临时性信息,可以实现onSaveInstancestate方(Bundle)法,所以该方法是在onStop或者onDestroy方法之前被调用,该方法的默认实现可以自动的保存View控件的状态数据,但该View必须有自己的id,用户可以重写保存额外的数据,但是当用户通过后退退出activity时则不会执行onSaveInstanceState,如果调用了onSaveInstanceState方法,则可以再onCreate(Bundle)或者onRestoreInstanceState方法中处理保存的临时性数据,onRestoreInstanceState方法是在onStart之后和onPostCreate之前调用,并且只有当activity确实被系统销毁了才会执行onRestoreInstanceState方法
- onSaveInstanceState在以下几种情况会被调用:
- 当用户按下HOME键时
- 长按HOME键,选择运行其他的程序时
- 按下电源按键(关闭屏幕显示)时
- 从activity A中启动一个新的activity时
- 屏幕方向切换时,例如从竖屏切换到横屏时(虚拟机按Ctrl+F11 可以切换), Activity会被摧毁并且被重新创建
- Android为关闭Activity提供了如下的方法:
- finish():结束当前Activity
- finishActivity(int requestCode):结束以startActivityForResult方法启动的Activity.如果B是A通过startActivityForResult启动的,那么在A中的onActivityReult函数中通过finishActivity结束B
- Activity之间传递消息可以使用Bundle对象,添加到Intent对象里然后发送给其他Activity,然后可以取出Intent和 Bundle中的信息,使用startActivityForResule启用另一个Activity后可以得到返回值
- Android采用Task来管理Activity,启动应用时,Android就会为之创建一个Task,Task以栈的形式来管理Activity,其中的activity可以来自不同apk,栈中的Activity不会被重新排列,只是入栈或者出栈,调用Activity的getTaskId()方法可以获取它所在的task的ID,Activity的android:launchMode属性用于配置Activity的加载模式,该属性支持四个值:
- standard模式:这种模式启动Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task中,这种模式不会启用新的Task
- singeTop模式:与standard模式类似,区别是当将要被启动的目标Activity已经位于Task栈顶时系统不会重新创建目标Activity的实例,而是直接复用已有的Activity
- singelTask模式:在同一个Task内只有一个实例,如果不存在会新建,如果存在但不在栈顶,系统会把该Activity上面的所有Activity一出Task,从而使得目标Activity注入栈顶
- singleInstance模式:系统保证无论从哪个Task中启动目标Activity,只会创建一个Activity实例,并会使用一个全新的Task栈来装载该Activity实例,该栈只有一个Activity
- Task可以在用户启动新Task或者回到Home屏时被整体移到后台,task位于后台时,task栈中所有的activities都处于停止状态(执行onStop后的状态),但activities不会被移除,只有当后台任务过多,内存不足时,系统可能会销毁后台的activities来释放内存
-
<intent-filter> //指定该Activity是程序的入口,如果未指定activity无法启动 <action android:name="android.intent.action.MAIN" /> //指定加载应用时运行该activity <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
- 影响Activity启动关键点大致有三个因素:Activity注册信息中的launchMode、启动Activity时Intent中的launchFlags和Activity注册信息中的taskAffinity、allowTaskReparenting、clearTaskOnLaunch、alwaysRetainTaskState、finishOnTaskLaunch等信息。通常情况下,我们只需要针对第一个因素进行合理设置就能满足我们应用开发的需求了。
- Activity,Window,View之间的关系:
- Activity构造的时候会初始化一个PhoneWindow对象,PhoneWindow是window的实现类
- Window类是一个载体,其中包含一个DecorView,它是所有应用窗口的根View,包含通知栏,标题栏(ActionBar),内容栏,对普通的FrameLayout进行功能的扩展和装饰,如添加标题栏,ActionBar
- DocorView会添加ViewGroup到窗口中