Android四大组件之Activity
做Android开发的没有不知道Activity的,Activity是开发者遇到最频繁, 最多的组件。这里把一些比较不经常用到的知识做一个汇总。
Activity生命周期
引用块内容
要点
onStart(), onResume()为可见状态; onPause(),为部分可见状态; 其他为不可见状态 onSaveInstanceState 保存状态; onRestoreInstanceState恢复状态Activity 启动模式
Activity启动方式有四种,分别是:
standard singleTop singleTask singleInstancestandard:默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
singleTop: 可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
例如:若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。
singleTask: 只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
例如:
若我的应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论我在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。
但是C1->C2->C3->C2->C3->C1-C2,这样的操作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。
操作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2
实际:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2
若是别的应用程序打开C2,则会新启一个task。
如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。
注意:如果此时你点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。
singleInstance: 只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。
若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。
Activity传递参数
Intent 传递参数类型:
boolean, char, byte, double,float,int, long, short 基本数据类型及其数组
CharSequence/CharSequence[], String/String[], Bundle
以及实现了 Serializable 或 Parcelable 的对象
Serializable: java提供, 所有实现了Serializable的类,都是可序列化类。不需要实现任何方法。
Parcelable:android 特有,效率较高。需要重写 writeToParcel()
选择序列化方法的原则
在使用内存的时候,Parcelable 比 Serializable 性能高,所以推荐使用 Parcelable。
Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
Parcelable 不能使用在要将数据存储在磁盘上的情况,因为 Parcelable 不能很好的保证数据的持续性在外界有变化的情况下。尽管 Serializable 效率低点,但此时还是建议使用 Serializable 。
实现Parcelable步骤
implements Parcelable
重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据
重写describeContents方法,内容接口描述,默认返回0就可以
实例化静态内部对象CREATOR实现接口Parcelable.Creator
例如:
public class MyDemo implements Parcelable {
private int mData;
private int mHaha;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeInt(mHaha);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public MyDemo createFromParcel(Parcel in) {
return new MyDemo(in);
}
public MyDemo[] newArray(int size) {
return new MyDemo[size];
}
};
private MyDemo(Parcel in) {
mData = in.readInt();
mHaha = in.readInt();
}
}
Acivity configChanges属性
一般在AndroidManifest.xml文件中都没有使用到 android:configChanges =”orientation|screenSize”配置,当然还是很有用的。
就是如果配置了这个属性,当我们横竖屏切换的时候会直接调用onCreate方法中的 onConfigurationChanged 方法,而不会重新执行onCreate方法,那当然如果不配置这个属性的话就会重新调用onCreate方法了
android:configChanges=[“mcc“, “mnc“, “locale“,
“touchscreen“, “keyboard“, “keyboardHidden“,
“navigation“, “screenLayout“, “fontScale“, “uiMode“,
“orientation“, “screenSize“, “smallestScreenSize“]
IMSI(国际移动用户识别码)发生改变,检测到SIM卡,或者更新MCC mnc: The IMSI mobile network code (MNC) has changed — a SIM has been detected and updated the MNC.
IMSI网络发生改变,检测到SIM卡,或者更新MCC
其中mcc和mnc理论上不可能发生变化 locale: The locale has changed — the user has selected a new language that text should be displayed in.
语言发生改变,用户选择了一个新的语言,文字应该重新显示 touchscreen: The touchscreen has changed. (This should never normally happen.)
触摸屏发生改变,这通常是不应该发生的 keyboard: The keyboard type has changed — for example, the user has plugged in an external keyboard.
键盘类型发生改变,例如,用户使用了外部键盘 **keyboardHidden:**The keyboard accessibility has changed — for example, the user has revealed the hardware keyboard.
键盘发生改变,例如,用
您可能想查找下面的文章:
- 滑动关闭activity,滑动activity
- 切换横竖屏的时候Activity的生命周期变化情况,activity生命周期
- Android—Service与Activity的交互,androidactivity
- Android中Activity运行时屏幕方向与显示方式详解,androidactivity
- Android生命周期,activity生命周期
- Android 面试题--Activity,android--activity
- Android 四大组件之Activity(续2),androidactivity
- Android动态加载Activity原理
- [Android] Activity间切换,传递数据,androidactivity
- Android Activity的生命周期简单总结