组件的生命周期
应用程序组件都有一个生命周期,从响应Intent的Android实例开始到这个实例被销毁。在这期间,他们或许有效或许无效,有效时或许对用户可见或许不可见。下面我们就来讨论四个基本组件的生命周期,包括在生命周期内的各种状态,以及状态之间的转换。这几种状态可能的结果是:进程让他们停止, 然后实例被销毁。
一、activity生命周期
一个activity有三个基本的状态:
@ 当activity在前台运行时(在activity当前任务的堆栈顶),为活动或者运行状态。这时activity会响应用户的操作。
@ 当activity失去焦点但是对用户仍然可见时为paused暂停状态。此时,别的activity在他的上面,透明或者备有被全部覆盖。所以其中一些暂停的activity也可以被显示。一个暂停的activity是处于活动状态的(他维护着所有的状态保存着信息,并且依然附着在窗口管理器)。
@ 如果一个activity完全被另一个activity所掩盖那他会处于stop状态。但仍然保存着原来的状态和信息。然而,如果别的地方需要更多的内存而且这个activity仍一直处于隐藏状态,那么系统有可能会杀死他的进程。
如果一个activity是暂停或者停止状态,系统可以清理他们占用的内存,或者调用finish()方法,或者直接结束他的进程。当他再次显示给用户时,会完全的重新运行并且加载以前所存储的信息。
activity状态之间的转换,是通过以前的受保护方法完成的:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
这些都是钩子函数,你可以重写他们,当状态改变时做一些适当的处理。所有的activity在首次运行时必须实现onCreate()方法来初始化安装。activity可以实现onPause()来提交数据改变,然后准备停止与用户的交互。
调用超类
每一个实现的activity生命周期方法都会先调用一下父类的方法,例如:
view plaincopy to clipboardprint?
protected void onPause() {
super.onPause();
. . .
}
protected void onPause() {
super.onPause();
. . .
}
通过这两者比较?,这7个方法定义了一个activity的整个生命周期的方法。你可以实现并且监测这三个嵌套循环:
@ 整个生命周期
调用onCreate()方法和onDestroy()之间称为一个activity的完整的生命周期。activity会在onCreate()里执行所有的初始化安装,在onDestroy()方法里释放所有的剩余资源。例如:一个从网络下载程序的线程,就需要在onCreate()方法里创建,在onDestroy()方法里销毁。
@ 可见生命周期
可见生命周期是从onStart()方法到onStop()方法的时间。这段时间,用户会在屏幕上看到这个activity。尽管他可能不是在最顶层显示,也没有和用户进行任何交互。这两个方法之间,你可以保持需要向用户显示的资源。例如:你可以在onStart()方法时注册一个BroadcastReceiver检测某些变化来改变你的界面,当用户看不到这个activity的界面时可以在onStop()里注销这个BroadcastReceiver。这两个方法可以被调用很多次,在可见和对用户隐藏时,作为候补的activity待命。
@ 前台显示周期
一个activity从onResume()方法指导一个onPause()方法称为前台显示周期。此时他在其他的activity之上显示并且与用户交互。一个activity可以频繁的在这两个方法之间过度,例如:当设备休眠或者另一个新的activity启动时,它会进入onPause()状态,当一个activity运行结束或者新的接收到Intent请求时,activity的onResume()会被调用。因此,这两个方法里的代码量会很少。
下图说明了上面说的几个循环,里面的箭头说明了两个状态之间是否可以相互转换。有色的椭圆是activity主要的几个状态。正方形和长方形代表activity在状态之间转变时我们可以实现的一些回调方法。
注意killable这列,它指明了进程在调用方法返回后是否可以被系统杀死,而不执行其他的代码。onPause(), onStop(), and onDestroy()这三个方法可以,因为onPause方法首先被执行,他是唯一一个一定会被调用的方法当进程被杀死时,但是onStop()和onDestroy()方法不会。因此,你可以在onPause()方法里保存一些连续的数据,例如编辑。
killable这列被标记成no的方法,保护activity防止他们被调用时,被进程杀死。例如:一个activity是处于可被杀死的状态,当activity从onPause()方法跳转到onResume()方法时,在OnPause方法回调之前是不会被杀死的。
正如后面的章节:进程和生命周期,一个没有定义为“killable”的activity仍然可以被系统结束,但这时会发生在特殊情况下,比如没有其他资源时。
保存activity的状态
当系统(而不是用户)关闭一个activity来节省内存时,用户希望再次启动activity时会回到当时的状态。
为了在activity被杀死之前捕获他的状态,你可以实现 onSaveInstanceState()方法,Android会在一个activity将要被关闭时调用这个方法,也就是在onPause()方法之前。他回传递给方法一个Bandle对象,你可以用key-value的方式保存你的数据。当activity再次运行时。这个Bandle对象会传递给onCreate()方法、onStart()方法、onRestoreInstanceState()方法。这几个方法都能重建当时的activity状态。
不像onPause()和刚才讨论的其他几个方法,onSaveInstanceState()和onRestoreInstanceState()方法不是生命周期方法。不是不是总被调用。例如:Android在activity将要被系统销毁之前调用onSaveInstanceState()方法,当activity实例被用户的操作销毁时(例如按下Back键),是不会调用这个方法的。这种情况下没有理由保存他的状态。
Coordinating activities
当一个activity启动了另一个activity,他们都经历了生命周期的转换。一个暂停了或者结束了,其他的activity启动。一种情况你可能需要调节这些activity:
生命周期方法的回调顺序都是定义好的,尤其当两个activity在同一进程下:
1.当前运行的activity的onPause()方法被调用。
2.然后将要运行的activity的onCreate()、onStart()、onResume()方法被依次调用。
3.然后,如果将要运行的activity不太可见,那么onstop()方法会被调用。
二、Service的生命周期:
有了 Service 类我们如何启动他呢,有两种方法:
• Context.startService()
• Context.bindService()
1. 在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。
2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。
总结:
1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。
2. bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服务)。
由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。
与 Service 通信并且让它持续运行
如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。
提高 Service 优先级
Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。
为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。
三、android的service的生命周期与activity类似,但是有一些不同:
onCreate和onStart是不同的
通过从客户端调用Context.startService(Intent)方法我们可以启动一个服务。如果这个服务还没有运行,Android将启动它并且在onCreate方法之后调用它的onStart方法。如果这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。所以对于单个运行的Service它的onStart方法被反复调用是完全可能的并且是很正常的。
onResume、onPause以及onStop是不需要的
回调一个服务通常是没有用户界面的,所以我们也就不需要onPause、onResume或者onStop方法了。无论何时一个运行中的Service它总是在后台运行。
onBind
如果一个客户端需要持久的连接到一个服务,那么他可以调用Context.bindService方法。如果这个服务没有运行方法将通过调用onCreate方法去创建这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,并且它返回一个IBind对象以便客户端稍后可以调用这个服务。同一服务被客户端同时启动和绑定是很正常的。
onDestroy
与Activity一样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与很多Activity时的情况一样,当内存很低的时候Android也可能会终结一个服务。如果这种情况发生,Android也可能在内存够用的时候尝试启动被终止的服务,所以你的服务必须为重启持久保存信息,并且最好在onStart方法内来做。
分享到:
相关推荐
本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...
Service生命周期的理解和正确管理对于优化应用程序性能至关重要。以下是一个关于Service生命周期的详细解析,结合代码示例来阐述如何在Android中操作Service。 1. **Service生命周期概述** Service的生命周期主要...
### Activity的生命周期(LifeCycle) #### 一、Activity在Android中的地位 在Android开发中,Activity作为四大组件之首,其重要性不言而喻。四大组件包括:Activity(负责界面控制)、Service(用于维持一个进程...
总之,深入理解Activity生命周期和其背后的源码逻辑,对于编写高效、响应迅速且用户体验优秀的Android应用至关重要。开发者应熟练掌握这些知识点,以便在设计和调试应用时能得心应手。通过实践和分析ActivityDemo,...
`onDestroy()`则在Service被停止时调用,标志着Service生命周期的结束。值得注意的是,Service的生命周期管理需要谨慎处理,以避免内存泄漏和不必要的资源消耗。 Service与Activity之间的通信是通过Binder机制实现...
一、Activity生命周期概述 Activity的生命周期由创建、启动、运行、暂停、停止和销毁这6个状态构成。每个状态的变化都会触发特定的方法回调,开发者可以重写这些方法以执行相应的操作。 1. 创建(Creation): - `...
此外,Activity 生命周期还与其他组件的生命周期相关,例如 Fragment、Service 等。理解 Activity 生命周期是 Android 开发的基础,掌握了 Activity 生命周期,可以更好地开发 Android 应用程序。 在实际开发中,...
本教程将深入探讨Service的生命周期及其启动方式,并结合一个求平均值的Demo进行讲解。 首先,我们来理解Service的生命周期。Service有四个主要状态:创建(Created)、启动(Started)、绑定(Bound)和销毁...
理解Activity的生命周期和Intent的传值机制对于Android开发者来说至关重要。 Activity的生命周期分为三个主要阶段:启动(Start)、运行(Running)和销毁(Destroy)。在启动过程中,Activity会经历onCreate()、...
本实验报告将深入探讨Android应用程序,尤其是Activity、Service和Intent Receiver的生命周期,并解释如何正确管理这些组件以避免不必要的进程销毁。 首先,Android应用通常在独立的Linux进程中运行。当应用需要...
- 未绑定Activity的Service生命周期图显示了startService()启动的过程,而绑定Activity的Service生命周期图则展示了bindService()启动的过程,两者在生命周期上有显著差异。 理解并熟练掌握Service的生命周期及其...
startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...
在研究Activity生命周期时,源码分析是非常重要的一环。开发者可以通过查看Android框架的源代码,了解系统是如何调用这些回调方法的。例如,可以研究ActivityThread类中的handleCreateActivity()、...
Activity生命周期是Android开发中至关重要的一环,因为它决定了应用如何响应用户操作和系统事件。理解Activity的生命周期对于编写高效、稳定且用户体验良好的应用至关重要。 Activity的生命周期由多个关键状态组成...
Service的生命周期与Activity不同,启动的Service在`onStartCommand()`返回后开始运行,直到调用`stopService()`或`stopSelf()`。绑定的Service在所有客户端解绑后自动停止。 11. **Service的生命周期管理** 注意...
在这个"Activity生命周期demon"中,我们将深入探讨Activity在不同状态下的行为及其转换。 1. **Activity生命周期的阶段** - **创建(Created)**:当Activity首次被创建时,会调用`onCreate()`方法。在这个阶段,...
1. **初始状态**:当Activity首次被创建时,会经历`onCreate()`方法,这是Activity生命周期的第一个回调,用于进行初始化工作,如设置布局、数据绑定等。 2. **启动状态**:`onStart()`方法紧接着`onCreate()`,...
Activity生命周期与Service(后台服务)相结合,可以在Service中执行长时间运行的任务,同时保持与Activity的交互。例如,使用`bindService()`可以在Activity与Service之间建立连接,实现通信。 七、生命周期回调的...
在描述中提到的“坑”可能指的是在通信过程中遇到的问题,例如Service生命周期管理不当导致内存泄漏,或者Activity和Service之间的同步问题。开发者需要确保在Activity销毁时正确解除与Service的连接,防止Service被...
Service生命周期中的关键方法包括onCreate(), onStartCommand(), onBind(), onUnbind()和onDestroy()。 2. **Activity与Service的绑定** Activity可以通过bindService()方法来与Service建立绑定关系,这种绑定方式...