android 四大组件(未完待续)

73次阅读

共计 4080 个字符,预计需要花费 11 分钟才能阅读完成。

一、Activity
1.Activiy 的生命周期
1.1 正常情况下的生命周期(1)onCreate:我们可以在这里做一下数据的初始化,加载布局资源等工作。
(2)onRestart:当前 Activity 从不可见重新变为可见时调用,一般是用户行为所导致的。
(3)onStart:Activity 已经可见,但是还没出现在前台,我们看不到,也还无法与用户交互。
(4)onResume:Activity 可见,并出现在前台,可与用户交互。
(5)onPause:Activity 正在停止。此时可以做一下数据存储,停止动画,关闭广播等工作。但是不能太耗时,因为会影响新 Activity 的显示,onPause 必须执行完,新 Activity 的 onResume 才执行。
(6)onStop:Activity 即将停止,可以做些稍微重量级的回收工作,但是也不能太耗时。
(7)onDestory:回收和资源释放。
1.2 异常情况下的生命周期

资源内存不足导致低优先级的 Activity 被杀死;
系统配置发生改变导致 Activity 被杀死并重新创建,如横竖屏切换。默认情况下,横竖屏切换会导致 Activity 被销毁并且重建,当然我们也可以阻止系统重新创建我们的 Activity。

不想系统配置发生改变而重新创建 Activity 的时候,我们可以指定 configChanges 这个属性。如横竖屏切换不想重新创建 Activity 时,配置 android:configChanges=”orientation|screenSize”(sdk 大于 13 的时候需要加 screenSiz),这样 Activity 就不会被重建,也就不会调用 onSaveInstanceState 和 OnRestoreInstanceState,取而代之的是调用 onConfigurationChanged。

Activity 异常终止的情况下,系统会调用 onSaveInstanceState 来保存当前的 Activity 状态。这个方法和 onPause 没有既定的顺序,可能在它之前,也可能在它之后。当 Activity 被重建后,系统会调用 onRestoreInstanceState,并且会把 Activity 销毁前 onSaveInstanceState 保存的 Bundle 对象作为参数传给 OnRestoreInstanceState 和 onCreate 方法。OnRestoreInstanceState 和 onCreate 的区别是,OnRestoreInstanceState 一旦被调用,其 Bundle 一定是有值的,所以不需要判断是否为空。但 onCreate 不一定,在初次创建的时候 Bundle 为 null。官方建议在 OnRestoreInstanceState 里面恢复数据。
针对 onSaveInstanceState 和 OnRestoreInstanceState,系统只会在 Activity 异常终止的情况下才会去调用它,其他情况不会调用。
在 onSaveInstanceState 和 OnRestoreInstanceState 方法中,系统会自动为我们做一些恢复工作,比如当前 Activity 的视图结构,文本框里面的输入,ListView 的滚动位置等。和 Activity 一样每个 View 都有 onSaveInstanceState 和 OnRestoreInstanceState 方法。
关于保存和恢复 View 层次结构,系统的工作流程是这样的:首先 Activity 会调用 onSaveInstanceState 去保存数据,然后 Activity 会委托 Window 去保存数据,接着 Window 再委托它上面的顶层容器去保存数据。顶层容器很可能是一个 DecorView。最后顶层容器再一一通知它的子元素来保存数据,这样整个保存数据的过程就完成了。可以发现,这是一个典型的委托思想,上层委托下层,父容器委托子元素去处理事情。
2.Activity 4 种状态,3 个循环

4 种状态:1. 运行状态(前台,可见有焦点);2. 暂停状态 (可见,失去焦点);3. 停止状态(不可见);4. 销毁状态。
3 个循环:1. 完整的生命周期;2. 可视的生命周期 (onStart-onStop);3. 前台生命周期(onResume-onPause)。

3.Activiy 的优先级,从高到低

前台 Activity:正在和用户交互的 Activity;
可见但非前台 Activity:onPause;
后台 Activity:已经被暂停的 Activity,onStop。

4.Activity 的启动模式 每次启动一个 Activity,系统就会把创建的 Activity 实例放入任务栈中,当我们单击 back 键,会发现 Activity 会一一回退。任务栈是一种“先进后出”的栈结构,每按一次 back 键,Activity 就会从栈中弹出,直到栈空了,系统就会回收该栈。
4.1 目前 Activity 有四种启动模式:standard,singleTop,singleTask,singleInstance。(1)standard:每次启动一个 Activity 都会创建一个新的实例放入启动它的 Activity 所在栈。比如 A 启动 B(standard 模式),则 B 就会放入 A 所在的栈中。如果,通过 ApplicationContext 启动 standard 模式的 Activity 会报错,因为非 Activity 的 Context 没有任务栈,这时就需要通过为 Activity 指定 FLAG_ACTIVITY_NEW_TASK 标记位创建一个新栈。
(2)singleTop:当前栈,栈顶复用模式。如果新 Activity 位于该栈栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 会被回调,通过此方法的参数我们可以调取当前的请求信息。该 Activity 的 onCreate、onStart 不会被调用。
(3)singleTask:栈内复用,这是一种单例模式。比如,一个 singleTask 的 Activity A 请求启动后,系统首先会寻找是否存在 A 想要的任务栈,如果不存在,就重新创建一个任务栈,然会创建 A 放入栈中。如果存在该栈,这时要看该栈中是否存在 A,如果存在 A 则 clearTop 清空 A 上面的所有实例,让 A 位于栈顶(此时不会重新创建实例,会回调 onNewIntent)。如果不存在实例 A 则创建新实例放入栈顶。
默认情况下,所有的 Activity 所需的任务栈的名字为应用包名,当然我们也可以通过 TaskAffinity 参数为 Activity 指定所需的任务栈,名字不能和报名相同。
(4)singleInstance:单实例模式。此模式的 Activity 只能单独的位于一个任务栈中,由于栈内复用特性,后续的请求均不会创建新的 Activity 除非被销毁再创建。
4.2 设置 Activity 的启动模式(1)在 AndroidManifest.xml 里对应的 <activity> 标签设置 android:launchMode 属性,例如:
<activity
android:name=”.A1″
android:launchMode=”standard” />
(2)通过 Intent 中设置标志位
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
两者之间的区别:第二种优先级高于第一种,两种同时存在时以第二种为准;第一种没办法为 Activity 设置运行状态,如 FLAG_ACTIVITY_CLEAR_TOP,而第二种没办法为 Activity 指定 singleInstance 模式
5.Activity 的启动方式
显式启动
通过给 Intent 设置类名启动
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
隐式启动
在 AndroidManifest.xml 中定义某个 Activity 的 intent-fliter。
<activity
android:name=”xxx”
android:taskAffinity=”xxx”>
<intent-filter>
<action android:name=”com.example.activity.ACTION_START” />
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”com.example.activity.ACTION_START” />
<data android:mimieType=”xxx”/>
</intent-filter>
<activity/>
Activity 中调用,只有 action 和 category 和 data 完全匹配时, 才会启动。
Intent intent = new Intent(“com.example.activity.ACTION_START”);
//android.intent.category.DEFAULT 是一种默认的 category, 在 startActivity 时自动添加
intent.addCategory(“com.example.activity.ACTION_START”);
intent.setData(xxx);
startActivity(intent);
隐式启动相对耗时,适用于不同应用键的 Activity 跳转;显式启动效率高,适用于一个应用内的 Activity 跳转。
二、BroadcastReceiver
转载自 Carson_Ho 的:Android 四大组件:BroadcastReceiver 史上最全面解析

正文完
 0