1、一个应用程序可能包含多个Activity,一般会有一个"main"activity。一个Activity可以通过startActivity启动其他的Activity。当一个新的Activity启动后,先前的Activity就会stopped,然后保存在一个叫作"backstack"的栈中。这个新的Activity放在栈顶并取得焦点。当栈顶Activity通过按Back按钮结束后,这个Activity就会变成destoryed状态,并且从栈顶删除,然后次栈顶的Activity进入resumes状态。
2、管理Activity的生命周期
-
Resumed
- 该Activity 在屏幕的前台而且必须获得了焦点,也被称为"running" 状态。 Paused
- 该Activity 部分可见,可能是因为前台Activity 是透明的或者前台Activity 太小,没有把该Activity 全部遮住,此时,该Activity 没有焦点,不能和用户交互。但该Activity 仍然“活着”,并且仍然attach 到窗口管理器上。在整个生命周期中,从调用onPause() 之后开始,系统可能会因为内存等原因而把该Activity 的进程杀死,所以你应该在onPause() 方法中保存至关重要的数据(在onSaveInstanceState() 中保存状态) ,但也不能在onPause() 中进行太多的处理,因为onPause() 之后往往resume 其他Activity, 这样会使启动过慢。 Stopped
- 该Activity 不可见,但仍然在“Backstack” 中,但是没有attach 到窗口管理器中。
- onSaveInstanceState 方法:
- 当该Activity 被系统由于资源不足、配置改变等而被杀死时,用于保存该Activity 的状态信息(比如旋转手机屏幕前该Activity 的状态) ,默认情况下只保存每个UI 的一些状态,用户还可以保存其他的一些状态( 比如当前选中了ListView 的哪一项) 。自定义的状态保存在一个Bundle 中,可以在该Activity 重启时在onCreate() 或者onRestoryInstanceState 中恢复。注意此方法和onPause() 或者onStop() 等的不同。onPause() 在activtiy 被放置到背景或者自行销毁时总会被调用,onStop() 在activity 被销毁时被调用,而onSaveInstanceState 是被系统强制销毁时才调用,只进入后台不调用。一般onSaveInstanceState 用于保存Activity 的状态,onPause() 用于保存数据。
- 3、两个相关的Activity之间的startActivity()
- 当一个Activity 启动了另一个,它们都会发生生命周期状态的变化。第一个Activity 经历pause 然后stop( 当然,如果它仍然可见,就不经历stop), 第二个Activity 调用onCreate(). 如果这两个Activity 共享数据,则有必要知道第二个Activity 启动之后,第一个Activity 还没有完全stop ,即第一个Activity 的stopping 过程和第二个Activity 的starting 过程是重叠的。
- 1 、ActivityA's onPause() method executes.
- 2 、ActivityB 's onCreate() , onStart() ,and onResume() methods execute in sequence.
- 3、 Then,if Activity A is no longer visible onscreen, its onStop()method executes.
所以,假如你必须在Activity A中向数据库中写入数据,以便Astop之后B可以从该数据库中读取数据,你应该在onPause()中实现写数据库而不是在onStop()中。
Fragment的重要知识点
1、就像一个子Activity一样,可以在一个Activity中调用不同的Activity,也可以在不同的Activity中调用同一个Fragment.Fragment的设计哲学主要是为了用来支持更加动态和灵活的控件设计在大屏的平板上。
2、使用onCreateView(LayoutInflaterinflater, ViewGroup container,BundlesavedInstanceState)方法在Fragment中添加一个xml布局文件。
3、把Fragment添加到Activity中,有两种方法:
3.1:在Activity的xml布局文件中添加<fragment>标签。每个<fragment>代表一个Fragment类。
3.2:在Activity类中把一个Fragment类动态的添加到Activity的一个ViewGroup中。
4、还可以往Activity添加一个Fragment,但是该Fragment中没有自己的控件,该Fragment只是提供一个背景行为,具体参考示例ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java
5、可以使用FragmentManager管理一个Activity类中的Fragment。在Activity中可以使用getFragmentManager()获得FragmentManager实例。
6、可以对Fragment执行add,remove, replace等transaction操作,还可以把操作行为添加到backstack中,用于导航键的返回。具体使用FragmentTransaction进行操作,该实例可以在Activity中通过getFragmentManager().beginTransaction()获得。具体参考示例:ApiDemos/src/com/example/android/apis/app/FragmentStack.java
7、Fragment与Activity进行通行:
7.1:在Fragment中调用getActivity()获得所嵌入的Activity对象,即可访问该Activity的资源,如:getActivity().findViewById(R.id.list)。
7.2:在Activity中要先获得FragmentManager对象,进而获得相应的Fragment对象,即可访问Fragment中的方法,如:ExampleFragmentfragment =
(ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment);
8、在Fragment中给Activity创建事件回调函数
可以让fragment和Activity之间共享事件,常用方法是在fragment中定义一个回调接口,然后让Activity实现这个接口。当这个Activity收到这个回调接口时,它可以把这个信息共享给其他的fragment.
9、Fragment的生命周期
9.1Activity和Fragment最大的不同在于backstack的管理:Activity是放置于一个由系统管理的Activity栈中,而fragment是放置于由宿主Activity管理的栈中,而且需要显示的申明要把该fragment保存在backstack中,通过调用addToBackStack().
9.2Fragment的生命周期与Activity的关系见下图
当Activity达到resumed状态后,你就可以随意的删除或添加fragments到Activity.也就是只有Activity到达resumed状态后,你才可以独立的改变fragment的状态。
Task and Back Stack
1、管理taskand back stack:默认情况下,Android管理taskand back stack的方式是把所有的activities放在同一个task中,并且按照"lastin, first out"的方式放在backstack中,同一个task中可能会有几个相同的activity实例。如果你想改变默认的方式,比如:在一个新的task中开始一个activity、如果该stack中已经存在一个该activity的示例,就不在创建该实例,而是把先前的实例取出放到栈顶等。你可以通过两种方式改变默认的管理方式:
1.1通过<activity>的属性
taskAffinity
launchMode
有四种launchMode可以用来指示activity在task中的启动模式:
"standard"(thedefault mode)
在启动它的
stack
中创建一个新的实例,不管该实例在该
stack
中是否已经存在。
"singleTop"
如果要新建在实例在当前栈顶,则不新建,其它和默认相同。例如:但需要创建
ActivityD
时,如果原来栈中是
ABCD
,则不新建
D
的实例,栈中还是
ABCD
。但如果原来栈中是
ABDC
,则仍然新建
D
的实例,变成
ABDCD
。此时调用
D
的
onNewIntent()
方法。
"singleTask"
如果
ActivityA
的属性设置为
singleTask
,则当
ActivityB
启动
A
时,就会新建一个栈,让
A
在栈顶,但是当从
A
返回时仍然返回到
B
。要是已经存在一个栈,该栈中有
A
的一个实例,则让该栈中
A
上方的
Activity
都出栈,让
A
变成栈顶,而不新建栈,此时调用
A
的
onNewIntent()->onRestart()->onStart()->onResume()
。
"singleInstance"
它会启用一个新的栈结构,将
Acitvity
放置于这个新的栈结构中,并保证不再有其他
Activity
实例进入,该
Activity
是这个栈中唯一的成员,凡是被这个
Activity
启动的
Activity
都会在其他的栈中启动。但是最后退出的出口总是该
Activity
,不管它是不是
Mainctivity
,见
http://blog.csdn.net/liuhe688/article/details/6754323
allowTaskReparenting
clearTaskOnLaunch
alaysRetainTaskState
finishOnTaskLaunch
1.2通过startActivity()中的intent的flag:
FLAG_ACTIVITY_NEW_TASK
和
launchMode=”singleTask”
相同
FLAG_ACTIVITY_CLEAR_TOP
如果要启动的
Activity
已经存在于一个
stack
中,则将该
Activity
之上的所有
Activity
都出栈,并且调用该
Activity
的
onNewIntent()
方法。
FLAG_ACTIVITY_SINGLE_TOP
和launchMode=”singleTop”相同