停止和重新启动一个Activity
合适的停止和重新启动你的Activity是你的Activity生命周期中的重要的过程,从而使得你的用户感觉你的app是一直活着的,并且不会丢失他们的进度。有一些关键的场景,你的Activity会被停止和重新启动。
- 用户打开最近使用app的窗口,并且从你的app切换到另一个app。你的app中当前正在前台运行的Activity会被停止,如果用户从主屏幕登陆图标或最近使用app窗口返回你的app,Activity被重新启动。
- 用户在你的app中执行一个动作启动一个新的Activity。当第二个Activity被创建的时候当前的Activity被停止。如果用户之后按返回按钮,第一个Activity被重新启动。
- 当在电话上使用你的app时用户接到一个电话。
Activity类提供两个生命周期方法,onStop()和onRestart(),这允许你明确你的Activity如何处理被停止和被重新启动。不像暂停状态,暂停状态是明确部分UI被遮掩,停止状态保证UI不再可见并且用户的关注点在别的Activity上(或者完全是另一个app)。
注意:因为当Activity停止时系统在系统内存中保持你的Activity实例,可能你完全不需要实现onStop()和onRestart()(或者甚至是onStat()方法)方法。对于大多数相对简单的Activity来说,Activity能很好的停止和重新启动,并且你也许只需要使用onPause()方法来暂停正在执行的动作和从系统资源断开。
停止你的Activity
当你的Activity收到一个onStop()方法的调用时,它将不再可见并且应该释放几乎所有当用户不使用它时不需要的资源。一旦你的Activity被停止了,系统可能会销毁这个实例当它需要释放系统内存时。在极端的情况下,系统可能简单的杀掉你的app进程,而不调用Activity最终的onDestroy()回调函数,因此使用onStop()方法来释放资源很重要,因为可能泄露内存。
尽管onPause()方法在onStop()方法之前被调用,你应该使用onStop()方法执行更大的,更加CPU密集型的关闭操作,比如写信息到数据库。
例如,这里有一个onStop()的实现,将笔记草稿的内容保存到永久性存储中。
@Override protected void onStop() { super.onStop(); // Always call the superclass method first // Save the note's current draft, because the activity is stopping // and we want to be sure the current note progress isn't lost. ContentValues values = new ContentValues(); values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText()); values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle()); getContentResolver().update( mUri, // The URI for the note to update. values, // The map of column names and new values to apply to them. null, // No SELECT criteria are used. null // No WHERE columns are used. ); }
当你的Activity被停止时,Activity对象仍然被保存在内存中,在Activity被重新启动后被找回。你不需要重新初始化那些在Resumed状态之前所调用的回调方法中创建的组件。系统也会保持当前布局中各个视图View的当前状态的跟踪,因此如果用户在EditText组件中输入文本,内容会被保存,因此你不需要去保存和恢复它。
注意:即使当处于Stopped状态时系统销毁了你的Activity,系统仍然在一个Bundle(一个保存键值对的二进制文件)中保存着视图对象的状态(比如文本框中的文本),并且在用户导航回同样的Activity实例时恢复它们(下一课将讨论更多关于在你的Activity被销毁和重新创建时使用一个Bundle来保存其他状态数据的内容)。
启动和重新启动你的Activity
当你的Activity从Stopped状态回到前台运行,它会被调用onRestart()方法。系统也会调用onStart()方法,这会发生在每次你的Activity变得可见时(不管是被重新启动还是被首次创建)。然而,onRestart()方法只在Activity从Stopped状态被重新启动时才会被调用,因此你可以使用它来执行一些特殊的恢复工作,这些工作可能只在Activity原来只是被停止,而没有被销毁时才是需要的。
一个app需要使用onRestart方法来恢复Activity状态是不常见的,因此没有任何关于这个方法的指南适用于普通的app。然而,因为你的onStop()方法本应该清除你的Activity所有的资源,在Activity重新启动时你会需要重新初始化它们。然而,当你的Activity在首次创建时(当还不存在Activity的实例时)你也需要初始化它们。因为这个原因,你应该使用onStart()回调方法作为onStop()方法的配对,因为系统在当它第一次创建你的Activity时和当它从Stopped状态重新启动你的Activity时都会调用onStart()方法。
举个例子,因为用户在回来之前可能已经长时间的离开你的app,onStart()方法是一个好地方来验证需要的系统特性是否使能了。
@Override protected void onStart() { super.onStart(); // Always call the superclass method first // The activity is either being restarted or started for the first time // so this is where we should make sure that GPS is enabled LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!gpsEnabled) { // Create a dialog here that requests the user to enable GPS, and use an intent // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action // to take the user to the Settings screen to enable GPS when they click "OK" } } @Override protected void onRestart() { super.onRestart(); // Always call the superclass method first // Activity being restarted from stopped state }
当系统要销毁你的Activity,它会为你的Activity调用onDestroy()方法。因为你通常应该在onStop()方法中释放你的大多数资源,当你收到onDestroy方法时,大多数app都不需要做什么。这个方法是你的最后机会来清除资源,从而避免资源泄露,因此你应该确保那些额外的线程已经被销毁了,并且其他长时间的动作比如方法跟踪也被停止了。
相关推荐
当活动从一个状态转变为另一个状态时,系统会调用相应的保护方法来通知这种变化。这些方法包括但不限于: - `onCreate(Bundle savedInstanceState)`:当活动首次创建时调用。这是执行所有静态设置的地方,例如创建...
例如,通过一个隐式Intent,可以启动一个符合特定Intent过滤器的未知组件;而显式Intent则明确指定要启动的组件。 **关闭组件** 关闭组件通常涉及停止Service或者销毁Activity。当不再需要组件时,系统会自动管理...
3. **设置新语言**:创建一个新的`Configuration`对象,将其`locale`属性设置为想要切换到的语言,例如`new Configuration(currentConfig).setLocale(new Locale("zh", "CN"))`。 4. **应用更改**:调用`Context`的...
嵌入式八股文面试题库资料知识宝典-华为的面试试题.zip
训练导控系统设计.pdf
嵌入式八股文面试题库资料知识宝典-网络编程.zip
人脸转正GAN模型的高效压缩.pdf
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
少儿编程scratch项目源代码文件案例素材-鸡蛋.zip
嵌入式系统_USB设备枚举与HID通信_CH559单片机USB主机键盘鼠标复合设备控制_基于CH559单片机的USB主机模式设备枚举与键盘鼠标数据收发系统支持复合设备识别与HID
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
面向智慧工地的压力机在线数据的预警应用开发.pdf
基于Unity3D的鱼类运动行为可视化研究.pdf
少儿编程scratch项目源代码文件案例素材-霍格沃茨魔法学校.zip
少儿编程scratch项目源代码文件案例素材-金币冲刺.zip
内容概要:本文深入探讨了HarmonyOS编译构建子系统的作用及其技术细节。作为鸿蒙操作系统背后的关键技术之一,编译构建子系统通过GN和Ninja工具实现了高效的源代码到机器代码的转换,确保了系统的稳定性和性能优化。该系统不仅支持多系统版本构建、芯片厂商定制,还具备强大的调试与维护能力。其高效编译速度、灵活性和可扩展性使其在华为设备和其他智能终端中发挥了重要作用。文章还比较了HarmonyOS编译构建子系统与安卓和iOS编译系统的异同,并展望了其未来的发展趋势和技术演进方向。; 适合人群:对操作系统底层技术感兴趣的开发者、工程师和技术爱好者。; 使用场景及目标:①了解HarmonyOS编译构建子系统的基本概念和工作原理;②掌握其在不同设备上的应用和优化策略;③对比HarmonyOS与安卓、iOS编译系统的差异;④探索其未来发展方向和技术演进路径。; 其他说明:本文详细介绍了HarmonyOS编译构建子系统的架构设计、核心功能和实际应用案例,强调了其在万物互联时代的重要性和潜力。阅读时建议重点关注编译构建子系统的独特优势及其对鸿蒙生态系统的深远影响。
嵌入式八股文面试题库资料知识宝典-奇虎360 2015校园招聘C++研发工程师笔试题.zip
嵌入式八股文面试题库资料知识宝典-腾讯2014校园招聘C语言笔试题(附答案).zip
双种群变异策略改进RWCE算法优化换热网络.pdf
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。