1>暂停Activity
当系统调用你的activity中的onPause(),从技术上讲,那意味着你的activity仍然处于部分可见的状态,但大多数时候,那意味着用户正在离开这个activity并马上会进入Stopped state. 你通常应该在onPause()回调方法里面做下面的事情:
1)停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
2)提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮件草稿).
3)释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
4)例如, 如果你的程序使用Camera,onPause()会是一个比较好的地方去做那些释放资源的操作。
1)停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
2)提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮件草稿).
3)释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
4)例如, 如果你的程序使用Camera,onPause()会是一个比较好的地方去做那些释放资源的操作。
通常,你不应该使用onPause()来保存用户改变的数据(例如填入表格中的个人信息)
到永久存储(File或者DB)上。仅仅当你确认用户期待那些改变能够被自动保存的时候(例如正在撰写邮件草稿),你可以把那些数据存到永久存储 。然而,你应该避免在onPause()时执行CPU-intensive 的工作,例如写数据到DB,因为它会导致切换到下一个activity变得缓慢(你应该把那些heavy-load的工作放到onStop()去做)。
2>恢复Activity
当用户从Paused状态恢复你的activity时,系统会调用onResume()方法。
请注意,系统每次调用这个方法时,activity都处于最前台,包括第一次创建的时候。所以,你应该实现onResume()来初始化那些你在onPause方法里面释放掉的组件,并执行那些activity每次进入Resumed state都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)
3>停止Activity
当你的activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源。一旦你的activity停止了,系统会在不再需要这个activity时摧毁它的实例(和栈结构有关,通常back操作会导致前一个activity被销毁)。在极端情况下,系统会直接杀死你的app进程,并且不执行activity的onDestroy()回调方法,
因此你需要使用onStop()来释放资源,从而避免内存泄漏。(这点需要注意)
尽管onPause()方法是在onStop()之前调用,你应该使用onStop()来执行那些CPU intensive的shut-down操作,例如writing information to a database.
4>重启Activity
当你的activity从Stopped状态回到前台时,它会调用onRestart().系统再调用onStart()方法,onStart()方法会在每次你的activity可见时都会被调用。onRestart()方法则是只在activity从stopped状态恢复时才会被调用,因此你可以使用它来执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。
使用onRestart()来恢复activity状态是不太常见的,因此对于这个方法如何使用没有任何的guidelines。然而,因为你的onStop()方法应该做清除所有activity资源的操作,你需要在重新启动activtiy时重新实例化那些被清除的资源,同样, 你也需要在activity第一次创建时实例化那些资源。介于上面的原因,你应该使用onStart()作为onStop()所对应方法。因为系统会在创建activity与从停止状态重启activity时都会调用onStart().(这个地方的意思应该是说你在onStop里面做了哪些清除的操作就应该在onStart里面重新把那些清除掉的资源重新创建出来)
如果因为系统资源紧张而导致Activity的Destory, 系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(描述了当Activity被Destory时的状态)来重新创建一个新的Activity实例。那些被系统用来恢复之前状态而保存的数据被叫做 "instance state" ,它是一些存放在Bundle对象中的key-value
pairs。(请注意这里的描述,这对理解onSaveInstanceState执行的时刻很重要)
默认情况下, 系统使用 Bundle 实例来保存每一个视图对象中的信息(例如输入EditText 中的文本内容)。因此,如果你的Activity被destroyed与recreated, 那么layout的状态信息会自动恢复到之前的状态。然而,你的activity也许存在更多你想要恢复的状态信息,例如记录用户Progress的成员变量(member variables)。
为了让你可以保存额外更多的数据到saved instance state。在Activity的声明周期里面存在一个添加的回调函数,你必须重写这个函数。这个回调函数并没有在前面课程的图片示例中显示。这个方法是onSaveInstanceState() ,当用户离开你的Activity时,系统会调用它。当系统调用这个函数时,系统会在你的Activity被异常Destory时传递
Bundle 对象,这样你可以增加额外的信息到Bundle中并保存与系统中。然后如果系统在Activity被Destory之后想重新创建这个Activity实例时,之前的那个Bundle对象会(系统)被传递到你的activity的onRestoreInstanceState()方法与 onCreate() 方法中。
当你的Activity从Destory中重建。你可以从系统传递给你的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。
因为 onCreate() 方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,你必须在你尝试读取 Bundle 对象前Check它是否为null。如果它为null,系统则是创建一个新的Activity instance,而不是恢复之前被Destory的Activity。
你也可以选择实现
onRestoreInstanceState() ,而是不是在onCreate方法里面恢复数据。 onRestoreInstanceState()方法会在 onStart() 方法之后执行.系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此你不需要检查
Bundle 是否为null。
5>销毁Activity
当系统Destory你的activity,它会为你的activity调用onDestroy()方法。因为我们会在onStop方法里面做释放资源的操作,那么onDestory方法则是你最后去清除那些可能导致内存泄漏的地方。因此你需要确保那些线程都被destroyed并且所有的操作都被停止。
本文深入探讨Android应用生命周期中的核心方法,包括如何暂停、恢复、停止和重启Activity,以及如何利用onSaveInstanceState方法保存和恢复Activity状态。通过理解这些方法,开发者可以更有效地管理资源,提升用户体验。
1751

被折叠的 条评论
为什么被折叠?



