管理activity的生命周期
通过实现回调方法来管理activity的生命周期。一个activity的生命周期受与它关联的其它activity,task和back stack的影响。
一个activity存在3种状态:
- resumed(running)-activity运行在前台并且获得用户焦点。
- paused-另一个activity运行在前台并且获得用户焦点,但是当前activity仍然可见,paused状态下的activity仍然存活(保持同window manager的联系),但是当内存不足的时候可能会被系统kill掉。
- stopped-当前activity完全被另一个activity隐藏掉(用户不可见),并且运行在后台。stopped状态下的activity仍然存活(但是失去了与window manager的联系),但是当内存不足的时候可能会被系统kill掉。
当activity处于paused或者stopped状态的时候,系统可以通过调用它的finish方法或者直接kill掉activity。当activity被再次打开的时候,系统需要整个从头创建该activity。
实现生命周期回调
当一个activity的状态发生变化的时候,系统会通过调用各种回调方法来通知activity,你可以覆盖回调方法,在状态变化的时候做你想做的事情(必须先调用父类的回调方法,然后再追加你自己的实现)。
public class ExampleActivity extends Activity { @Override public voidonCreate
(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // The activity is being created. } @Override protected voidonStart()
{ super.onStart(); // The activity is about to become visible. } @Override protected voidonResume()
{ super.onResume(); // The activity has become visible (it is now "resumed"). } @Override protected voidonPause()
{ super.onPause(); // Another activity is taking focus (this activity is about to be "paused"). } @Override protected voidonStop()
{ super.onStop(); // The activity is no longer visible (it is now "stopped") } @Override protected voidonDestroy()
{ super.onDestroy(); // The activity is about to be destroyed. } }
这些回调方法包括3个闭环:
- entire lifetime-从onCreate到onDestroy,比如在onCreate里面开始一个线程,然后在onDestroy里面结束该线程。
- visible lifetime-从onStart到onStop,比如在onStart里面注册一个BroadcastReceiver来监视UI的各种变化,然后在onStop里面取消注册(因为此时用户已经看不到该activity)。
- foreground lifetime-从onResume到onPause,onPause一般在屏幕休眠或者弹出对话框的时候被调用。因为foreground lifetime执行比较频繁,所以在onResume和onPause方法中的代码要力求简洁并且保证快速执行,以提高用户的使用体验。
保存activity的状态
activity处于paused或者stopped状态的时候,activity对象仍然被保存在内存中,所以当activity再次进入前台的时候,原来的状态信息仍然存在。但是,为了释放内存,系统销毁掉activity以后,activity的状态信息也不复存在,这时,用户再次进入activity的时候,原来的状态信息将不复存在。为了保存重要的状态信息,可以通过覆盖onSaveInstanceState方法来实现。
当activity处于容易被销毁的状态的情况下,比如:onStop之前或者onPause之前,会调用onSaveInstanceState方法,并传入一个Bundle对象,你可以把要保存的状态信息以key-value pair的方式存入Bundle对象,这样系统销毁activity之后,用户再次进入activity的时候,系统会把之前保存好的Bundle对象传给onCreate方法和onRestoreInstanceState方法,你可以从Bundle对象中取出之前保存的状态信息。
但是,并不能确保activity在销毁前一定会调用onSaveInstanceState方法,因为有些情况下不需要保存状态信息,比如用户明确点击后退按钮退出activity。
即使你不实现onSaveInstanceState,activity的缺省实现也会保存一部分状态信息,它会分别调用layout中的每个view的onSaveInstanceState方法,大部分widget都会保存自己的状态信息,比如EditText会保存用户输入的信息,CheckBox会保存check状态,唯一需要你做的是为每个想保存状态信息的widget提供一个唯一的android:id。
<TextView android:id="@+id/nameTextbox"/>
aapt工具会自动在R.java中生成一个唯一的整型id,在代码中可以像下面这样直接引用。
findViewById(R.id.nameTextbox);
虽然activity的缺省实现会保存UI的一些信息,但是你可能仍然需要覆盖它来保存一些其他的状态信息,为了保留UI的状态信息,在覆盖onSaveInstanceState和onRestoreInstanceState方法的时候要先调用父类的实现,然后在后面追加你自己的实现。
因为onSaveInstanceState不能保证100%调用,所以,你应该只保存一些临时的状态信息,而不能用来保存持久化的数据,持久化的数据应该在onPause方法中进行保存(比如插入数据库,写入文件等)。
测试你的应用恢复状态信息的能力的一个比较好的方法是,旋转你的设备。因为屏幕方向变化的时候,为了应用相应的资源文件,系统会销毁并重建activity。因为用户在使用应用的时候会经常旋转屏幕,所以确保你的activity在旋转屏幕的时候能够完整地恢复状态信息是十分重要的。
处理配置变更
一些设备可以在运行的时候改变设置,比如:屏幕的方向,可用的键盘,语言。此时,android会重新创建所有运行中的activity(onDestroy,然后onCreate)。这种机制为了帮助你的应用自动重新使用你提供的相应的资源,比如:不同的layout,不同的屏幕方向和大小。
协调activities
当一个activity启动了另一个activity,那么这两个activity都发生了状态的变化,第一个activity先onPause再onStop,另一个activity先onCreate,再onStart,onResume。
activity A启动activity B的过程如下:
- 执行activity A的onPause
- 执行activity B的onCreate,onStart,onResume(此时,B已经获得了焦点)
- 如果A在屏幕上不可见,那么,再执行activity A的onStop方法
如果你需要在activity A stop的时候把一些数据写入数据库,然后在activity B中需要使用这些写入的数据,那么你必须在activity A的onPause方法中写入数据库,而不是onStop方法。
相关推荐
在Android应用开发中,Activity是用户界面的主要组件,它负责与用户进行交互。"Activity Lifecycle demo"是一个关于Android活动生命周期的示例项目,通过这个项目,开发者可以深入理解Activity在不同状态之间的转换...
### Activity的生命周期(LifeCycle) #### 一、Activity在Android中的地位 在Android开发中,Activity作为四大组件之首,其重要性不言而喻。四大组件包括:Activity(负责界面控制)、Service(用于维持一个进程...
在Android开发领域,Activity是应用中的核心组件,它负责与用户进行交互,展现应用程序的界面。...通过学习和实践"Activity-Lifecycle-06"这样的项目,开发者能够更好地控制和优化其应用程序的行为,提升用户体验。
【Jetpack】Lifecycle 架构组件 ( 系统组件与普通组件解耦 | Lifecycle 解耦系统组件与普通组件 | 解耦服务组件与普通组件 | 监听应用程序生命周期 ) https://hanshuliang.blog.csdn.net/article/details/129291874...
16. **Android Jetpack组件**:包括Lifecycle、Navigation、WorkManager等,这些组件可以简化开发,提高代码质量。 通过分析这些源码实例,开发者不仅可以了解每个知识点的运用,还能学习到实际项目中的最佳实践,...
可能在项目中看到的Jetpack组件包括Lifecycle、Room、Paging等。 12. **性能优化**: - 作为一款工具应用,优化电池使用是核心。源码可能包含对电池使用情况的检测、分析,以及针对低电量模式的优化策略。 通过对...
AndroidManifest.xml是应用的核心配置文件,定义了应用组件、权限和其他重要信息;bin目录包含编译后的文件;res目录存放应用资源;assets目录用于放置非结构化的资源文件;gen目录存放自动生成的R.java文件;src...
在Android应用开发中,`Activity`是用户界面的主要载体,它是应用程序中负责与用户交互的组件。本项目"Prob1-Understanding-the-Life-Cycle-of-an-Activity"旨在深入理解`Activity`的生命周期,这对于开发高效、响应...
Android应用程序是由多个组件构成的,每个组件都有特定的功能。 - **Activity**:用户界面的核心部分。 - **Service**:后台运行的服务。 - **BroadcastReceiver**:用于接收广播消息。 - **ContentProvider**:...
11. **Jetpack组件**:Android Jetpack是一组库、工具和指南,简化了Android开发,包括Lifecycle、Navigation、Paging等组件,它们能帮助开发者构建高质量、可维护的应用。 12. **自定义View和动画**:高级应用可能...
在Android开发中,Activity是应用程序的核心组件之一,它负责用户界面的展示和交互。`android-activity-detector`项目则是对Activity生命周期进行监控的实现,以便于了解用户在何时何地与哪些应用进行了互动。它利用...
Fragment则是可嵌入到Activity中的模块化组件,用于构建适应不同屏幕尺寸的应用。 2. **布局管理器(Layout Manager)**:如LinearLayout、RelativeLayout、ConstraintLayout等,它们决定了UI元素在屏幕上的排列...
Lifecycle-aware components是Android Jetpack的一部分,它提供了一种声明式的方式来管理组件的生命周期,如LiveData和ViewModel,可以减少生命周期管理的复杂性并防止内存泄漏。 LiveData是一种观察者模式实现,...
`Lifecycle` 组件则是一组接口和类,用于跟踪 Android 应用组件(如 Activity 和 Fragment)的生命周期状态。它允许第三方库和其他组件更好地与应用的生命周期同步,确保在正确的时间执行操作。通过 Lifecycle,我们...
5. **生命周期管理**:TreeCore可能实现了对Activity和Fragment生命周期的精细化管理,比如使用Lifecycle库,以防止内存泄漏和不必要的资源消耗。 6. **异步处理**:框架可能利用了RxJava或Coroutines进行异步操作...
在Android应用开发中,Activity是用户界面的主要组件,它的生命周期是开发者必须深入理解的关键概念。本文将详尽探讨Android Activity的生命周期,以及如何在Java编程中有效地管理它。 Activity生命周期包含了一...
Activity是Android应用开发中的核心组件,它代表了用户与应用交互的界面。了解并掌握Activity的生命周期对于构建高效、响应迅速且用户体验良好的Android应用至关重要。谷歌官方提供的Activity生命周期示例(...
Android应用程序主要由各种组件构成,其中最常见的就是Activity,它代表用户界面的一个屏幕。`Android-Lifecycle`这个主题深入探讨的就是Activity的生命周期,以及如何在不同的状态下管理应用程序的行为。 Activity...
在Android开发中,Jetpack库是Google推荐的重要组件之一,其中Lifecycle组件对于管理Activity和Fragment的生命周期至关重要。本文将深入探讨Lifecycle源码的原理和实现机制,帮助开发者更好地理解和运用这个强大的...