android-activity详解

来源:互联网 发布:c语言文件读写 编辑:程序博客网 时间:2024/06/05 14:27

一、activity的生命周期
1>正常情况下的生命周期
2>异常情况下的生命周期

(1)正常情况下的生命周期:
onCreate——>onStart——>onResume—–>onPause——>onstop—–onDestory
onrestart。
注意:两个activity切换执行的顺序为,第一个先onPause,第二个activity才开始onCreate.

(2)异常情况下的生命周期:1:系统配置发生改变,2,:内存不足低优先级被杀死。

1:系统配置发生改变,activity被杀死并重建(场景:竖屏变为横屏)    activity----->onSaveInstanceState----->onDestory    activity----->onCreate----->onRestoreInstanceState 系统配置发生改变,系统会调用activity的onSaveInstanceState方法,将需要的参数保存在参数  bundle中,这个bundle会作为参数传递给activity再次创建时的onCreate和onRestoreInstanceState  保证我们的activity正常运行切换横竖屏,onSaveInstanceState执行在onstop之前,onRestoreInstanceState  执行在onStart之前,onSaveInstanceState和onRestoreInstanceState系统为我们做了很多的恢复工作,比如空间的数据等,查看view相关的系统源码发现,view中也有onSaveInstanceState和onRestoreInstanceState,用来自我恢复,根据Android系统的源码分析得知,系统所执行的操作为,activity调用onSaveInstanceState等方法,这个时候activty会委托window保存数据,window再委托它的顶级容器去保存数据,顶级容器一般为viewGroup(DecorView),最后顶级容器再一一通知他的子元素来保存数据。 等取数据的时候一个这个顺序,这种委托思想在android中很多应用。
public class SaveActivity extends Activity{        @override        protected void onCreate(Bundle saveInstanceState){            super.onCreate(saveInstanceState);            setContentView(R.layout.main);            if(saveInstanceState != null){                String test = saveInstanceState.getString("tian");            }        }        @override        protected void onSaveInstanceState(Bundle outState){            super.onSaveInstanceState(outState);            outState.putString("tian","songtao");        }        @override        protected void onRestoreInstanceState(Bundle savedInstanceState){            super.onRestoreInstanceState(savedInstanceState);            String test = savedInstanceState.getString("tian");        }    }    当系统配置改变时我们想办法不重建activity:        activity在AndroidMenifest.xml中有配置可以不重建activity            android:configChanges="orientation"多个选项用|隔开        eg:<activity                android:name="mainActivity"                android:configChanges="orientation|screenSize"></activity>         @override         public void onConfigurationChanged(Configuration newConfig){             super.onConfigurationChanged(newConfig);             Log.d(TAG," newOrientation : " + newConfig.orientation);         }

由上可以看出,activity这个配置,当屏幕横竖屏发生改变时activity就不会重建。
就会调用onConfigurationChanged方法,在这个方法里我们可以进行操作。

 activity有很多配置,这个可以网上查:但常用的系统配置: 1:android:configChanges="locale" 系统位置发生改变,一般指切换了系统语言 2:android:configChanges="orientation | screenSize"系统屏幕方法改变 3:android:configChandes="keyboardHidden" 系统键盘是否可用,也就是说键盘是否弹出。

2:资源内存不足导致低优先级activity被杀死:
注意:这种情况和情况1的数据保存恢复完全一致。
activity的优先级描述:
1>前台activity,与用户交互,优先级最高
2>可见非前台activity,比如dialog对话框出来时,activity可见但无法交互
3>后台activity,已经被暂停,执行stop方法,
当系统内存不足时会按照优先级杀死目标activity所在的进程。

二、activity的启动模式:standard,singleTop,SingleTask,SingleInstance.

    1:standard:标准模式,也是系统默认的模式,每次启动一个activity都会创建一个新的实例,        并执行它全部的生命周期。这个必须时activity启动另一个activity,因为activity中的        context会告诉下一个activity启动位于那个栈。    2:singleTop:栈顶复用模式:若activity位于栈顶,则activity不会重新创建,但会执行        onNewIntent方法,    3:singleTask:栈内复用模式:这是一种单利模式,若activity在这个栈内存在,那么activity        就不会被重新创建,但会回调onNewIntent    4:singleInstance:单实例模式:一种加强的singleTask,它具有singleTask全部特性,但activity        只能单独位于一个任务栈中,例如,A是singleInstance模式,系统启动它就会为A创建一个单独        的任务栈,A单独在这个新的任务栈中,由后期单独复用,不会在从新被创建。eg: activity启动模式指定     1:<activity         android:name="com.tian.MainActivity"        android:taskAffinity="com.tian.song"        android:launchMode="singleTask"></activity>     2:Intent intent = new Intent();       intent.setClass(mainActivity.this,mainActivity.class);       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);       startActivity(intent);     TaskAffinity:任务栈相关性,这个属性可以确定activity位于那个任务栈中,常与singleTask一起用。    eg:这里有三个activity,A、B、C ,         A:launchMode(standard),Main        BC:launchMode(SingleTask)  taskAffinity("com.tian.song")     启动应用程序,这里从ApplicationContext中启动A,创建一个任务栈1A创建实例进入任务栈1A        启动activity-B,因为规定了singleTask,taskAffinity参数,则从新创建一个任务栈2,这个任务        栈为com.tian.song, B创建实例并进入了栈2,B启动C,因为SingleTask,taskAffinity参数和B一致,        则C会创建一个实例,进入任务栈2,以为taskAffinity参数一致,C再启动A,这时,以为A是从C启动的。        上下文为C的context,A的启动模式为standard,则A创建实例,进入任务栈2,这时再启动B则因为B已经        存在与栈2,由因为栈内顺序为BCA,根据数据栈的结构,要想显示B,则CA必须先出栈,所以这时B显示了        但栈2内就只剩下了B-activity,这时按两下back键,第一次返回的是任务栈1中的A,再一次返回,显示        的就是桌面了,这就是利用singTask和TaskAffinity控制的activity顺序。
0 0