-
简要概述
Activity是四大组件中唯一与用户直接交互的, 开发者通过调用setContentView方法来展示UI 。
onCreate() : 在这个方法中设置你的UI布局, 做静态初始化工作(初始化UI控件)
onPause() : 当你在离开Activity的时候会被触发调用, 更重要时要记得在这保存你的数据(可通过ContentProvider来保存数据)
如果要使用content.startActivity , 那么这个被启动的Activity一定要在Androidmanifest.xml中声明。如果开发大屏应用Fragment是最佳的选择, 它从3.0开始出来, 如果兼容3.0之前的系统可以使用Support.v4 包
-
生命周期
Activity 被系统的Activity Stack管理,当一个新的Activity被创建, 那么它将处于Activity Stack的栈顶并成为运行状态, 之前处于栈顶的Activity将自动处于其之下,并且将不会再次回到前台,直到它之前的Activity退出栈。
Activity的状态如下:
1. 如果Activity处于屏幕的前台, 即处于Stack栈顶, 那么他的状态即 活动的或者运行的。
2. 如果Activity失去焦点但是仍然对用户可见(比如,一个非全屏的或者透明的Activity获取到焦点并处于栈顶时), 那么它将处于暂停状态。 处于暂停状态的Activity是完全活着的(它维持所有的状态和成员信息,并仍然保持依附于WindowManager), 但是它可以被系统在极端低内存的情况下杀死。
3. 如果Activity被其他Activity完全覆盖,完全不可见, 那么它将处于停止状态, 它仍然维持着所有的状态和成员信息, 但是它不再对用户可见, 它可能在系统任何时候需要内存的时候杀死。
4. 假如Activity处于暂停或者停止状态, 系统可以删除内存中的Activity并使之Finish , 或者直接杀掉它的进程。 他会被重启并重新恢复所有状态, 当他再次对用户可见的时候。
Activity的生命周期经典图:
下面3个环节在你监控Activity的时候需要注意:
1. Activity的整个生命周期处于第一次onCreate到最后onDestroy , 开发者需要设置所有的全局状态变量在onCreate的时候, 并释放资源在onDestroy的时候, 假如你在onCreate创建了一个线程在后台工作, 那么你需要在onDestroy的时候结束它 。
2. Activity的可见生命周期是从onStart开始到onStop结束。 你可以在onStart注册广播, 在onStop取消注册广播。这两个方法可能会被调用多次, 当它再次对用户可见或者隐藏时。
3. Activity处于前台的生命周期是从onResume开始到onPause结束。 在这段时间内它处于所有Activity栈的前面, 并可以与用户交互。 这两个方法被调用的频率最多,比如:设备休眠时。
所有生命周期的方法 , 必须首先调用super父方法
-
屏幕旋转
当屏幕旋转或者Configuration配置发生变化的时候, Activity 会跟随变化。 这种变化可能发生在: 语言变化, 屏幕尺寸变化, 屏幕方向变化, 输入法等, 它可能引起当前的Activity被摧毁, 如果这个Activity处于前台对用户可见, 那么它可能会被重新创建, 可以通过onSaveInstanceState来保存并且会在新的Activity中恢复这些状态。 这样做是因为应用的资源文件可以跟随configuration的值来变化, 重新加载,检测所有资源文件是唯一的安全方式来应对configuration的变化。 因为Activity必须已经知道这种状态并根据状态来重新创建它 , 这种一种非常简单的方式来根据configuration来重新创建它。 在某些特殊的案例中, 你可能不需要重新创建Activity 当configuration发生不同变化的时候, 你需要设置Androidmanifest.xml中设置android:configChanges来完成它, 只要你声明了任何配置类型的更改已经有了处理, 它将不会重新创建Activity并调用onConfigurationChanged 方法。
-
启动Activity与获取Result
通过startActivity来启动一个Activity, 它仅附带一个Intent参数, 这个对象中描述了要启动的Activity。 有些时候你可能需要从要启动的Activity中获取到一个返回结果, 那么需要用startActivityForResult方法来启动Activity, 并使用onActivityResult方法来处理这种结果。 当启动的Activity退出的时候, 需要调用setResult方法来告之结果。
-
保存持久化数据
当Activity处于onStop或者onDestroy 生命周期时,可能会被随时杀掉, 因此开发者需要在onPause方法这里做数据保存, 实际上, onSaveInstanceState方法会在Activity进入到后台的时候调用,开发者可以利用Bundle来保存动态的状态变量, 当他需要被重新创建的时候这些数据会在onCreate中被接收。 onPause比onSaveInstanceState更适合做数据保存, 因为后者并非是Activity生命周期的一部分, 它并非在各种场景中都会被调用。 要知道这些语义在不同安卓平台中出现细微变化, android.os.Build.VERSION_CODES.HONEYCOMB 相对比之前的安卓平台, Activity不再处于可杀死的状态直到onStop结束, 这会影响onSaveInstanceState的调用。 生命周期的方法不再会被标记为可杀死状态, 在方法执行过程中Activity进程将不再会被系统杀死, 只有有种Activity处于可杀死状态, 比如: onPause方法之后,到onResume之前 。
一般有两种方式来对Activity的数据做持久化保存:
1. 储存在Sqlite中
使用ContentProvider来做数据库存储的时候,
2. 储存在SharePreference中
-
权限
安卓系统中有许多权限, 比如网络权限, 蓝牙权限, 文件读写权限, 网络权限等。 当使用到这些功能时, 需要在AndroidManifest.xml中声明。使用带权限Intent.FLAG_GRANT_READ_URI_PERMISSION 或者 Intent.FLAG_GRANT_WRITE_URI_PERMISSION的Intent启动Activity时, 这将授予对特定URL的访问Activity, 访问将保留,直到Activity结束 。 自android.os.Build.VERSION_CODES.GINGERBREAD(姜饼) 系统后, 如果Activity已经被创建过, 那么再次启动时, 新的Intent将被传递到onNewIntent方法中
-
进程生命周期
Android系统会将可能的保存应用进程更久的时间, 但是最终还是要删除旧的进程(时间久的)再内存不足的时候。 Activity的生命周期中, 被删除的进程将紧密依赖其与用户交互的状态, 进程的运行将取决于它的Activity的四种状态:
1. 处于前台的Activity (与用户正在交互且处于屏幕的最上方)是被视为最重要的,如果使用的内存比设备可用的内存要多, 它的进程将被在最后杀死。它需要保证足够的内存来用于用户交互。
2. 处于可见状态的Activity是被认为极为重要的, 并且不会被杀死, 除非是为了保证前台Activity的运行。
3. 处于后台的Activity不再是关键了, 因此系统可以安全的干掉它来保证前台或者可见的进程运行。 当它被干掉到再次创建时, onCreate会持有所有onSaveInstanceState的状态信息。
4. 一个空的进程(没有Activity,或者是一个组件(服务,广播)), 当系统内存低的时候, 将会被迅速回收, 正因为如此, 在做任何脱离Activity之外的后台操作, 需要在Activity广播或者服务的上下文中执行, 使系统知道它需要保持在你的应用进程周围。
有时候Activity需要做独立存在于生命周期的长时间操作, 比如: 要上传一张照片到服务器, 耗时很长的时候用户需要退出它到后台完成, 这时候你的Activity需要开启一个Service来完成它, 这时候系统将会优先处理它, 不管你的Activity是处于停止,暂停还是finished状态。