Android Activity 注意笔记

Android Activity 注意笔记

图1:Activity生命周期的简化图,就像一个阶梯金字塔。这图像表明每个状态中是怎么样使用回调函数使得恢复状态回到顶端,或者降低状态到达底部。Activity可以从Paused状态和stopped状态恢复到Resumed状态。

正确使用你的Activity生命周期函数去保障应用程序的良好表现,必须注意很多方面,包括下面的内容:

  • 当用户接听电话或者转去另外一个应用程序时,不要让程序崩溃。
  • 当用户没有激活使用它时,不消耗宝贵的系统资源。
  • 当用户离开你的应用程序并在稍后的时间返回,不会丢失用户的进度。
  • 当用户屏幕在横向与纵向旋转切换时,不会崩溃或者丢失用户进度。

这其中只有3种状态是静态的。这意味着,activity 只能在这3种状态之一中存在一段时间:
Resumed状态

  • 在这种状态下,该Activity在前台运行,用户可以与它进行交互。(有时也简称为“running”状态。)

Paused状态

  • 在这种状态下,该Activity被部分遮蔽(被其他在前台的半透明或不覆盖整个屏幕的活动遮住)。此状态不接受用户输入,并且不能执行任何代码。

Stopped状态

  • 在这种状态下,该活动是完全隐藏,不可见的,可视为存在于后台。虽然停止,活动实例和所有成员变量如状态信息将被保留,但不能执行任何代码。

其他的状态(**created状态**和**started状态**)都是非常短暂而且系统通过调用函数使得非常快地转到下一状态。换句话说,当系统调用了onCreated()之后,非常快地就调用了onStart()方法使得进入下一状态,而又马上调用了onResumed又进入了下一状态。

onCreate()

你必须在onCreate()方法中操作一些在整个生命周期内只会调用一次的程序启动逻辑内容。例如,可以在onCreate()方法中定义用户界面的或者初始化一些类变量的内容。

如声明用户界面(在XML布局文件中定义),定义成员变量,并配置UI。

onDestroy()

大多数的应用程序并不需要实现这个函数,因为局部类的引用将会和Activity一起销毁,而一些清理工作,主要也是在onPaused()和onStop()中。然而,如果你的Activity包含了有在onCreated()或者其他持续性运行的资源在后台线程运行,您就应该在onDestroy()方法中清除掉它们,而避免内存泄露。

onPause()

当系统调用一个activity中的onPause()方法, 从技术上讲意味着这个activity仍然处于部分可见的状态,但是大多数时候,那意味着用户正在离开这个activity并很快会进入停止状态. 通常应该在onPause()回调方法里面完成以下操作:

  • 停止会耗费CPU的动画或者是其他正在运行的操作。

  • 提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮件草稿)。

  • 释放系统资源,例如广播接收器, 传感器(如GPS), 或者是其他任何当你的activity暂停时会影响到电量而用户并不需要的资源。

通常,不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储上。仅仅确认用户期待那些改变能够被自动保存的时候(例如书写邮件草稿时)才可以把那些数据存到永久存储上。然而,应该避免在onPause()时执行CPU密集的工作,例如写数据到数据库,因为它会导致切换到下一个activity的可视过程变得缓慢(那些重负荷的操作应该放到onStop()方法中完成)。

如果activity实际上是要被Stop,为了切换的顺畅应该减少在OnPause()方法里面的工作量。

Note: 当Activity处于暂停状态,Activity实例是驻留在内存中的,并且在Activity 恢复的时候重新调用。因而不需要在恢复到Resumed状态的一系列回调方法中重新初始化组件。

onResume()

你的activity每次来到最前台,系统都会调用这个方法,包括第一次创建的时候。所以,在实现onResume()方法时应该初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入恢复状态都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)。

onStop()

当activity调用onStop()方法时,该activity不再可见并且应该释放所有不再需要的资源。一旦activity停止了,系统可能会摧毁activity的实例以回收内存,甚至,系统会不执行activity的onDestroy()回调方法而直接杀死你的app进程, 因此需要使用onStop()来释放资源,从而避免内存泄漏。

尽管onPause()方法是在onStop()之前调用,通常应该使用onStop()来执行CPU密集型的关闭操作,例如把数据写入数据库。

onRestart()&onStart()

当Activity从Stopped状态回到前台时会调用onRestart(),系统还会再调用onStart()方法,onStart()方法在每次Activity可见时都会被调用(不管是重新启动还是第一次创建的时候)。onRestart()方法则是只在Activity从stopped状态恢复时才会被调用,因此可以使用它来执行一些特殊的恢复工作,请注意activity之前应是被stop而不是destrory。

由于onStop()方法要做清除所有Activity资源的操作,在重新启动Activtiy时需要重新实例化被清除的资源,同样,在Activity第一次创建时要实例化那些资源。因为系统会在创建Activity与从停止状态重启Activity时都会调用onStart(),应该使用onStart()作为onStop()所对应的方法。

例如:因为用户很可能在回到Activity之前需要过一段时间,所以onStart()方法是一个比较好的用来验证某些必须的功能是否已经准备好的地方。

 LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gpsEnabled)

由于会在onStop方法里面做释放资源的操作,大多数app不需要在onDestory方法中做太多事。onDestory方法是最后的去清除那些可能导致内存泄漏的地方,因此需要确保添加的线程都被销毁并且所有像方法跟踪之类的长效操作都被停止。

onSaveInstanceState()

当Activity开始Stop时,系统会调用onSaveInstanceState(),因此Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,例如在EditText组件中的文本或者是ListView的滑动位置。
为了给Activity保存额外的状态信息,必须实现onSaveInstanceState()并增加键值对到Bundle对象中.

警告: 必须要调用onSaveInstanceState()方法的父类实现,这样默认的父类实现才能保存视图状态的信息。

onCreate()&onRestoreInstanceState()

当Activity在被Destory后进行重建,可以从系统传递给Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。

因为onCreate()方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,所以必须在尝试读取Bundle对象前检查它是否为空。如果它为空,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。

onRestoreInstanceState()方法会在onStart()方法之后执行。系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需要检查Bundle是否为空。

警告: 与前面的一样,总是需要调用onRestoreInstanceState()方法的父类实现,这样默认的父类实现才能保存视图状态的信息。

上一篇:HDU 4612 Warm up(Tarjan)


下一篇:线程和进程PYTHON