当前位置:文档之家› Android四大组件的详细讲解

Android四大组件的详细讲解

Android应用程序由一些零散的有联系的组件组成,通过一个工程manifest绑定在一起。

在manifest中,描述了每一个组件以及组件的作用,其中有6个组件,它们是Android 应用程序的基石:Activities(活动)应用程序的显示层。

每一个画面对应于你的应用程序,将会是Activity类的扩展。

Activity使用Views去构建UI来显示信息和响应用户的行为。

就桌面开发而言,一个Activity相当于一张Form。

你在这章中将会学习到更多关于Activities。

Services(服务)Android应用程序中不可见的“工人”。

Service组件运行时不可见,但它负责更新的数据源和可见的Activity,以及触发通知。

它们常用来执行一些需要持续运行的处理,当你的Activity已经不处于激活状态或不可见。

你将在第8章学习怎样创建Service。

Content(内容)提供共享的数据存储。

Content Provider(内容提供器)用来管理和共享应用程序的数据库。

在应用程序间,Content Provider是共享数据的首选方式。

这意味着,你可以配置自己的Content Provider去存取其他的应用程序或者通过其他应用程序暴露的Content Provider去存取它们的数据。

Android设备本身包含了几个Content Provider来访问像联系人信息等有用的数据库。

你将在第6章学习怎样创建和使用Content Provider。

Intents(意图)简单的消息传递框架。

使用Intent,你可以在整个系统内广播消息或者给特定的Activity或者服务来执行你的行为意图。

系统会决定那个(些)目标来执行适当的行为。

Broadcast Receivers(广播接收器)Intent广播的“消费者”。

通过创建和注册一个Broadcast Receiver,应用程序可以监听符合特定条件的广播的Intent。

Broadcast Receiver 会自动的启动你的Android应用程序去响应新来的Intent。

Broadcast Receiver是事件驱动程序的理想手段。

Notifications(通知)用户通知的框架。

Notification用来在不需要焦点或不中断它们当前Activity的情况下提示用户。

它们是Service或Broadcast Receiver获得用户注意的首选方式。

例如,当设备收到文本信息或外部来电时,它通过闪光,发声,显示图标或显示对话框信息来提醒你。

在第8章里,你可以使用Notification来触发这些事件。

一、Activity详解Activty的生命周期的也就是它所在进程的生命周期。

一个Activity的启动顺序:onCreate()——>onStart()——>onResume()当另一个Activity启动时:第一个Activity onPause()——>第二个ActivityonCreate()——>onStart()——>onResume()——>第一个Activity onStop()当返回到第一个Activity时:第二个Activity onPause()——>第一个Activity onRestart()——>onStart()——>onResume()——>第二个Activity onStop()——>onDestroy()一个Activity的销毁顺序:(情况一)onPause()——><Process Killed>(情况二)onPause()——>onStop()——><Process Killed>(情况三)onPause()——>onStop()——>onDestroy()每一个活动(Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。

但是当一个活动的状态发生改变的时候,开发者可以通过调用onXX() 的方法获取到相关的通知信息。

在实现Activity 类的时候,通过覆盖(override )这些方法即可在你需要处理的时候来调用。

一、onCreate:当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。

onCreate 方法有一个参数,该参数可以为空(null ),也可以是之前调用onSaveInstanceState ()方法保存的状态信息。

二、onStart:该方法的触发表示所属活动将被展现给用户。

三、onResume:当一个活动和用户发生交互的时候,触发该方法。

四、onPause:当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。

这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。

五、onStop:当一个活动不再需要展示给用户的时候,触发该方法。

如果内存紧张,系统会直接结束这个活动,而不会触发onStop 方法。

所以保存状态信息是应该在onPause 时做,而不是onStop时做。

活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。

因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。

在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。

六、onRestart:当处于停止状态的活动需要再次展现给用户的时候,触发该方法。

七、onDestroy:当活动销毁的时候,触发该方法。

和onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。

· onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。

通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。

Activity栈上面提到开发者是无法控制Activity的状态的,那Activity的状态又是按照何种逻辑来运作的呢?这就要知道Activity 栈。

每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。

当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。

如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态。

如下图所示:一个应用程序的优先级是受最高优先级的Activity影响的。

当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。

Activity状态一般认为Activity有以下四种状态:活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。

Android 试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。

当另外一个Activity被激活,这个将会被暂停。

暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。

有可能原因是一个透明或者非全屏的Activity被激活。

当被暂停,一个Activity仍会当成活动状态,只不过是不可以接受用户输入。

在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。

当一个Activity变为完全隐藏,它将会变成停止。

停止:当一个Activity不是可视的,它“停止”了。

这个Activity将仍然在内存中保存它所有的状态和会员信息。

尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。

当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。

一旦一个Activity退出或关闭了,它将变为待用状态。

待用:在一个Activity被杀死后和被装在前,它是待用状态的。

待用Acitivity被移除Activity栈,并且需要在显示和可用之前重新启动它。

activity的四种加载模式在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。

加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。

在android里,有4种activity的启动模式,分别为:·standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。

·singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。

如果不位于栈顶,会产生一个新的实例。

·singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

·singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode 属性。

相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志,这个标志表示:如果这个activity 已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。

1Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);2intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);3startActivity(intent);复制代码Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。

下面是影响加载模式的一些特性核心的Intent Flag有:FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_RESET_TASK_IF_NEEDEDFLAG_ACTIVITY_SINGLE_TOP核心的特性有:taskAffinitylaunchModeallowT askReparentingclearTaskOnLaunchalwaysRetainTaskStatefinishOnTaskLaunch四种加载模式的区别所属task的区别一般情况下,“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。

相关主题