一个Activity的时候
1.当刚进入界面时生命周期MainActivity-onCreate-->MainActivity-onStart-->MainActivity-onResume
2.在页面点击home键时的生命周期MainActivity-onPause-->MainActivity-onStop
3.在2这种状态进入应用界面的生命周期MainActivity-onRestart-->MainActivity-onStart-->MainActivity
-onResume
4.点击back键或者执行finish()方法时生命周期变化MainActivity-onPause-->MainActivity-onStop
-->MainActivity-onDestroy
两个Activity的时候
1.当从MainActivity点击按钮跳转到MainActivity1界面过程中
生命周期变化:MainActivity-onPause-->MainActivity-1-onCreate-->MainActivity-1-onStart
-->MainActivity-1-onResume-->MainActivity-onStop
2.当从MainActivity1点击back键返回MainActivity界面过程中
生命周期变化:MainActivity-1-onPause-->MainActivity-onRestart-->MainActivity-onStart
-->MainActivity-onResume-->MainActivity-1-onStop-->MainActivity-1-onDestroy
横竖屏切换
生命周期变化:
MainActivity-onPause-->MainActivity-onStop-->MainActivity-onDestroy--MainActivity-onCreate
-->MainActivity-onStart-->MainActivity-onResume
1.横竖屏时想加载不同的布局:
1)准备两套不同的布局,Android会自己根据横竖屏加载不同布局: 创建两个布局文件夹:layout-land横屏,layout-port竖屏 然后把这两套布局文件丢这两文件夹里,文件名一样,Android就会自行判断,然后加载相应布局了!
2 )自己在代码中进行判断,自己想加载什么就加载什么:
我们一般是在onCreate()方法中加载布局文件的,我们可以在这里对横竖屏的状态做下判断,关键代码如下:
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.横屏);
}
else if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.竖屏);
}
2.状态保存问题
你只重写onSaveInstanceState()方法,往这个bundle中写入数据,比如:
outState.putInt("num",1);
这样,然后你在onCreate或者onRestoreInstanceState中就可以拿出里面存储的数据,不过拿之前要判断下是否为null哦!
savedInstanceState.getInt("num");
Activity间的数据传递(kotlin):
1.发送数据的界面
val intent = Intent(this,MainActivity1::class.java)
intent.putExtra("data","这是数据")
startActivity(intent)
putExtra可传递的类型有Byte、Short、Long、Int、Double、Float、Boolean、Char、String、bundle
2.接收数据的界面
val data = intent.getStringExtra("data")
多个Activity间的交互(后一个传回给前一个)
四种启动模式
standard模式:
标准启动模式,也是activity的默认启动模式。在这种模式下启动的activity可以被多次实例化,即在同一个任务中可以存在多个activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,即调用startActivity(new Intent(this,A.class)),会在A的上面再次启动一个A的实例,即当前的桟中的状态为A-->A。
singleTop模式:
如果一个以singleTop模式启动的Activity的实例已经存在于任务栈的栈顶, 那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例, 并且会调用该实例的onNewIntent() 方法将Intent对象传递到这个实例中。 举例来说,如果A的启动模式为singleTop,并且A的一个实例已经存在于栈顶中, 那么再调用startActivity(new Intent(this,A.class))启动A时, 不会再次创建A的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()方法。 这时任务栈中还是这有一个A的实例。如果以singleTop模式启动的activity的一个实例 已经存在与任务栈中,但是不在栈顶,那么它的行为和standard模式相同,也会创建多个实例。
singleTask模式:
只允许在系统中有一个Activity实例。如果系统中已经有了一个实例, 持有这个实例的任务将移动到顶部,同时intent将被通过onNewIntent()发送。 如果没有,则会创建一个新的Activity并置放在合适的任务中。
官方文档中提到的一个问题:
系统会创建一个新的任务,并将这个Activity实例化为新任务的根部(root) 这个则需要我们对taskAffinity进行设置了,使用taskAffinity后的解雇:
singleInstance模式
保证系统无论从哪个Task启动Activity都只会创建一个Activity实例,并将它加入新的Task栈顶 也就是说被该实例启动的其他activity会自动运行于另一个Task中。 当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例 的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同, 同一时刻在系统中只会存在一个这样的Activity实例。