安卓开发艺术探索笔记第一章

来源:互联网 发布:换手机登陆淘宝账号 编辑:程序博客网 时间:2024/05/16 19:25

1 Activity的生命周期全面分析

onPause必须先执行完,新Activity的onResume才会执行,所以onPause不能执行耗时操作。

如果新Activity采用了透明主题,那么当前Activity不会回调onStop;

onSaveInstanceState只会在Activity被异常终止的情况下才会调用,时间是在onStop之前,可能在onPause之前,也可能之后。

onRestoreInstanceState在onStart之后,

指定configChanges可以阻止系统匹配改变导致Activity重建;常用的locale,oretion,keybordhidden,screenSize(API>13);

2 Activity的LaunchMode

standard:标准模式,谁启动就在谁的栈中,Application,Context无法启动该模式,因为没有所谓的任务栈,解决方式为FLAG_ACTIVITY_NEW_TASK标志位。

singleTop:栈顶复用模式,如果位于栈顶,就不创建新实例,onNewIntemt被调用。

应用场景:推送消息,如果当前位于消息详情界面,从通知点击进入,只会创建一个实例。

登录场景,点击按钮登录,可能网络延迟,重复点击,就会显示两个登录界面。

singleTask: 栈内复用模式,此任务栈中只有一个实例,如果Activity A不在栈顶,且存在A的实例,会销毁A上面所有的

Activity,暴露出Activity A。

应用场景:

作用:程序的入口

做浏览器,微博之类的应用:

比如其他App需要打开我们的浏览器页面,

就可以设置  浏览器页面启动模式为singleTask模式,保证它只有一个实例,

节约内存同时按下返回键后的感官也更顺畅。

但是需要注意:

提供给人调用的页面最好是栈底元素,因为如果自己的客户端正在运行状态,按下home键后台挂起,此时如果其他应用(QQ)调自己的客户端的主页面,那么按下回退键

,页面都会停留在自己的客户端,(因为自己的Activity不为空),这明显不符合逻辑的。。。

singleInstance:单实例模式,只有一个实例,并且这个实例独立运行在activity任务栈中,这个task中只有这个实例,不允许有别的activity存在。

应用场景:拨打电话界面,我们app要调用拨打电话,发现系统应用已启动并单独存在,此时app就不需要重新创建,而是直接复用电话界面。

3 横竖屏切换生命周期

1 不设置Activity的android:configChanges时,切横屏会调用一次,切竖屏会执行两次。

2 设置Activity的android:configChanges="oriention"时,切屏还是会调用,切横竖只会执行一次。

3 设置Activity的android:configChanges="oriention"|keybordHidden,切屏不会调用各个生命周期,只会执行onConfiguartionChanges方法。

但是自从安卓3.2也就是api 13开始。还是会调用生命周期,这是因为screenSize也跟着屏幕的横竖切换而改变,所以在清单文件下,

MiniSdkVersion和TargetVersion属性大于13的情况下,如果你还想阻止程序在运行是重新加载Activity,还必须加一个属性ScreenSize。

4 安卓弹出dialog时activity的生命周期处于什么状态?

如果是当前activity弹出dialog,则不会执行activity任何方法,只有其他activity弹出了dialog或者挡住了当前的activity才会执行onPause方法。

5 Activity之间跳转的生命周期

A 到B onPause onCreate onStart onResume onStop 

在B界面点击back键回到A onPause onRestart onResume onStop onDestory 

在A界面按Home键回到桌面 onPause onStop

再次点击进入A界面 onRestart onStart onResume  。

6 简述Activity启动流程。

Activity启动源码相当复杂,涉及Instrumention,ActivityThread和ActivityManagerService(简称AMS).简单理解,启动Activity的请求会由

Instrumention来处理,然后它通过Binder向AMS发出请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,

 AMS通过ActivityThread去同步Activity的状态从而完成生命周期的方法的调用。