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,创建一个任务栈1,A创建实例进入任务栈1,A 启动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
- Android Activity类详解
- Android 详解Activity
- Android Activity BroadCastRceiver 详解
- Android Activity 生命周期详解
- Android Activity生命周期详解
- android activity 生命周期详解
- Android Activity生命周期详解
- android Activity详解
- Android Activity 详解
- android的activity详解
- 详解Android Activity组件
- Android Activity生命周期详解
- Android - Activity(活动) 详解
- Android Activity生命周期详解
- Android Activity类详解
- 详解Android Activity 生命周期
- Android Activity生命周期详解
- android activity 生命周期详解
- 1
- Java Socket实战之五 使用加密协议传输对象
- Hibernate one
- centos7配置静态IP步骤
- 2
- android-activity详解
- 基于Camshift算法的目标追踪
- Java Socket实战之六 使用NIO包实现Socket通信
- andorid 流式标签布局
- 绘图软件origin使用总结
- Ajax操作--JQuery的Ajax操作
- 过滤器和监听器的知识点大纲
- DHCP动态主机配置协议
- Java Socket实战之七 使用Socket通信传输文件