Activity重要知识点

本文深入探讨了Android中Activity的生命周期管理,包括Resumed、Paused、Stopped状态的区别及对应的操作,以及如何在Activity间传递数据。同时介绍了Fragment的设计哲学、生命周期与Activity的交互,包括Fragment的创建、添加、事件回调以及生命周期与Activity的关系。文章还详细解释了如何通过不同的属性和Intent的flag来管理Task和BackStack,以实现更灵活的应用程序架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,即第一个Activitystopping过程和第二个Activitystarting过程是重叠的。
1ActivityA'sonPause()method executes.
2ActivityB'sonCreate(),onStart(),andonResume()methods execute in sequence.
3Then,if Activity A is no longer visible onscreen, itsonStop()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:在Activityxml布局文件中添加<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, replacetransaction操作,还可以把操作行为添加到backstack中,用于导航键的返回。具体使用FragmentTransaction进行操作,该实例可以在Activity中通过getFragmentManager().beginTransaction()获得。具体参考示例:ApiDemos/src/com/example/android/apis/app/FragmentStack.java

7FragmentActivity进行通行:

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创建事件回调函数

可以让fragmentActivity之间共享事件,常用方法是在fragment中定义一个回调接口,然后让Activity实现这个接口。当这个Activity收到这个回调接口时,它可以把这个信息共享给其他的fragment.

9Fragment的生命周期

9.1ActivityFragment最大的不同在于backstack的管理Activity是放置于一个由系统管理的Activity栈中,而fragment是放置于由宿主Activity管理的栈中,而且需要显示的申明要把该fragment保存在backstack中,通过调用addToBackStack().

9.2Fragment的生命周期与Activity的关系见下图

Activity达到resumed状态后,你就可以随意的删除或添加fragmentsActivity.也就是只有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可以用来指示activitytask中的启动模式:

"standard"(thedefault mode)

在启动它的stack中创建一个新的实例,不管该实例在该stack中是否已经存在。

"singleTop"

如果要新建在实例在当前栈顶,则不新建,其它和默认相同。例如:但需要创建ActivityD时,如果原来栈中是ABCD,则不新建D的实例,栈中还是ABCD。但如果原来栈中是ABDC,则仍然新建D的实例,变成ABDCD。此时调用DonNewIntent()方法。

"singleTask"

如果ActivityA的属性设置为singleTask,则当ActivityB启动A时,就会新建一个栈,让A在栈顶,但是当从A返回时仍然返回到B。要是已经存在一个栈,该栈中有A的一个实例,则让该栈中A上方的Activity都出栈,让A变成栈顶,而不新建栈,此时调用AonNewIntent()->onRestart()->onStart()->onResume()

"singleInstance"

它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入,该Activity是这个栈中唯一的成员,凡是被这个Activity启动的Activity都会在其他的栈中启动。但是最后退出的出口总是该Activity,不管它是不是Mainctivity,见http://blog.youkuaiyun.com/liuhe688/article/details/6754323

allowTaskReparenting

clearTaskOnLaunch

alaysRetainTaskState

finishOnTaskLaunch

1.2通过startActivity()中的intentflag

FLAG_ACTIVITY_NEW_TASKlaunchMode=”singleTask”相同

FLAG_ACTIVITY_CLEAR_TOP

如果要启动的Activity已经存在于一个stack中,则将该Activity之上的所有Activity都出栈,并且调用该ActivityonNewIntent()方法。

FLAG_ACTIVITY_SINGLE_TOPlaunchMode=”singleTop”相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值