1、activity生命周期
onCreate onStart onResume onPause onStop onDestroy
activity A 跳转到activity B
A.onPause -> B.onCreate -> B.onStart -> B.onResume -> A.onStop -> A.onDestroy(A.onDestroy被回收的时候才会调用)
2、activity的启动模式
standard、singleTop、singleTask、singleInstance
singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈
- 如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
- 如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例
如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法
如果不存在该实例,则新建Activity,并入栈
此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。 - 由于具有“singleTask”或“singleInstance”启动模式的 Activity 只能位于任务的根,因此更改父项仅限于“standard”和“singleTop”模式
1、当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent;
2、singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它 Actiivty(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该 Task内创建Activity2。如果不存在,则重新生成新的Task并入栈。
allowTaskReparenting属性,当某个拥有相同 affinity 的任务即将返回前台时,Activity 是否能从启动时的任务转移至此任务中去 —“true”表示可以移动,“false”表示它必须留在启动时的任务中
3、android 横竖屏切换
1. 屏幕不旋转
在AndroidManifest文件中的对应Activity中配置android:screenOrientation=”landscape”(横屏,portrait是竖屏);
2. 屏幕旋转时不重新走生命周期
在AndroidManifest文件中的对应Activity中配置android:configChanges="keyboardHidden|orientation|screenSize",最好这三个都配置,否则不能适配所有机型或sdk版本。
默认情况下,屏幕会旋转并且会重新走生命周期。
切横屏,生命周期方法走一遍,切竖屏,生命周期方法走两遍 (用华为mate7测试,切竖屏也是走一遍生命周期)
4、fragment生命周期
onAttach onCreate onCreateView onActivityCreated onStart onResume onPause onStop onDestroyView onDestroy onDetach
5、fragment与activity传值
activity传值给fragment:
1、通过Bundle
Bundle bundle = new Bundle();
bundle.putString(Constant.INTENT_ID, productId);
Fragment fragment = new Fragment();
fragment.setArguments(bundel);
2、在宿主Activity中定义方法,将要传递的值传递到Fragment中,在Fragment中的onAttach方法中,获取到这个值
1)宿主activity中的getTitles()方法
public String getTitles(){
return "hello";
}
(2)Fragment中的onAttach方法
public void onAttach(Activity activity) {
super.onAttach(activity);
titles = ((MainActivity) activity).getTitles();//通过强转成宿主activity,就可以获取到传递过来的数据
}
fragment传值给activity:
1、Handler方式,在activity中定义Handler,然后在fragment中获取到activity的handler,发送消息
2、广播
3、EventBus
4、在fragment中定义接口,然后activity中实现该接口