Activity的生命周期

来源:互联网 发布:dt大数据梦工厂 spark 编辑:程序博客网 时间:2024/06/05 16:03

一 Activity生命周期

  根据你的activity的复杂度,你也许不需要实现所有的生命周期方法。然而,你需要知道每一个方法的功能并确保你的app能够像用户期望的那样执行。如何实现一个符合用户期待的app,你需要注意下面几点

  1当使用你的app的时候,不会因为有来电通话或者切换到其他app而导致程序crash

  2当用户没有激活某个组件的时候不要消耗宝贵的系统资源。

  3当离开你的app并且一段时间后返回,不要丢失用户的使用进度

  4当设备发送屏幕旋转的时候,不会crash或者丢失用户的使用进度

  Activity有三个状态Resumed,Stopped,Paused

   如果你的程序中没有一个activity声明了MAIN action 或者LAUNCHER category,那么在设备的主界面列表里面不会呈现你的app图标


二 暂停与恢复Activity

  当打开一个半透明的activity时(例如以对话框的形式),之前的activity会被暂停。 只要这个activity仍然被部分可见,之前的activity则一直处于Paused状态。

  当一个半透明的activity阻塞你的activity时,系统会调用onPause()方法并且这个activity会停留在Paused state (1). 如果用户在这个activity还是在Paused State时回到这个activity,系统则会调用它的onResume() (2).


  onPause()回调方法里面做下面的事情:

  • 停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
  • 提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮件草稿).
  • 释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
  • 例如, 如果你的程序使用Camera,onPause()会是一个比较好的地方去做那些释放资源的操作。

  onPause()方法中不能做耗时操作,应该留给onStop()方法去做

  通常,你不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储(File或者DB)上。仅仅当你确认用户期待那些改变能够被自动保存的时候(例如正在撰写邮件草稿),你可以把那些数据存到永久存储 。然而,你应该避免在onPause()时执行CPU-intensive 的工作,例如写数据到DB,因为它会导致切换到下一个activity变得缓慢(你应该把那些heavy-load的工作放到onStop()去做)。


三 停止与重启Activity

  在下面一些关键的场景中会涉及到停止与重启:

  • 用户打开最近使用app的菜单并切换你的app到另外一个app,这个时候你的app是被停止的。如果用户通过手机主界面的启动程序图标或者最近使用程序的窗口回到你的app,那么你的activity会重启。
  • 用户在你的app里面执行启动一个新的activity的操作,当前activity会在第二个activity被创建后stop。如果用户点击back按钮,第一个activtiy会被重启。
  • 用户在使用你的app时接受到一个来电通话.

  停止Activity

  • 当你的activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源。一旦你的activity停止了,系统会在不再需要这个activity时摧毁它的实例(和栈结构有关,通常back操作会导致前一个activity被销毁)。在极端情况下,系统会直接杀死你的app进程,并且不执行activity的onDestroy()回调方法, 因此你需要使用onStop()来释放资源,从而避免内存泄漏。(这点需要注意)
  • 尽管onPause()方法是在onStop()之前调用,你应该使用onStop()来执行那些CPU intensive的shut-down操作,例如writing information to a database.

三 重新创建Activity

  有几个场景中,Activity是由于正常的程序行为而被Destory的,例如当用户点击返回按钮或者是你的Activity通过调用finish()来发出停止信号。系统也有可能会在你的Activity处于stop状态且长时间不被使用,或者是在前台activity需要更多系统资源的时候把关闭后台进程,这样来获取更多的内存。

  你的Activity会在每次旋转屏幕时被destroyed与recreated。当屏幕改变方向时,系统会Destory与Recreate前台的activity,因为屏幕配置被改变,你的Activity可能需要加载一些alternative的资源(例如layout)

  (通常来说,跳转到其他的activity或者是点击Home都会导致当前的activity执行onSaveInstanceState,因为这种情况下的activity都是有可能会被destory并且是需要保存状态以便后续恢复使用的,而从跳转的activity点击back回到前一个activity,那么跳转前的activity是执行退栈的操作,所以这种情况下是不会执行onSaveInstanceState的,因为这个activity不可能存在需要重建的操作)


  Caution: 总是需要调用 onSaveInstanceState() 方法的父类实现,这样默认的父类实现才能保存视图状态的信息


  你也可以选择实现 onRestoreInstanceState() ,而是不是在onCreate方法里面恢复数据。 onRestoreInstanceState()方法会在 onStart() 方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此你不需要检查 Bundle 是否为null。

0 0
原创粉丝点击