Android Training - 停止和重启一个Activity


为了确保你的用户能感觉到程序一直是活着的,并且没有丢失他们的使用进度,合理的停止和启动你的activity将显得尤为重要。这里有一些场景是需要你的activity停止和重启的:

用户在你的程序中从“正在运行程序窗口”选择切换到其他程序。那么你的程序的activity就会被停止。如果用户从“主屏幕图标”或者“正在运行程序窗口”中选择了你的程序,那么这个activity会被重启。

用户在你的程序中执行一个行为启动了一个新的activity。当前activity就会被停止,第二个activity被创建。当用户点击Back按钮时,第一activity被重启。

当用户正在使用你的程序时接了一个电话。

Activity提供两个方法onStop()和onRestart()让你在停止和重启时做一些特定操作。和paused状态不一样的是,stopped状态保证了UI界面是不可见的,用户的焦点完全是在另外一个activity中(或者另外一个单独的程序中)。

提示:因为系统在stopped状态中会保存你activity实例在内存中,所以你可能不需要实现onStop()和onRestart()方法(甚至是onStart())。对大多数activity来说都是比较简单的,activity能够很好的停止和重启,你只需要使用onPause()暂停进行中的动作和释放系统资源。

图解:当你用户离开你的activity,系统调用onStop()停止activity(1)。如果从stopped状态返回activity,系统调用onRestart()(2),然后快速的执行onStart()(3)和onResume()(4)。注意,不管是什么场景导致activity的停止,系统都是先调用onPause()然后再调用onStop()。

停止你的Activity

当activity接收一个onStop()函数调用时,activity是不可见的,而且释放几乎所有不需要的资源。一旦activity被停止,系统在恢复系统内存时可能会销毁activity实例。在极少情况下,系统会直接杀掉你的程序进程而不调用activity的onDestroy()函数,所以在onStop()方法中释放资源,防止内存泄露是很重要的。

虽然onPause()在onStop()前被调用,不过你应该使用onStop()执行更大、更多CPU密集的关闭操作。比如写入信息到数据库。

比如,这是保存笔记草稿到永久存储器在onStop()中的实现:

  1. @Override  
  2. protected void onStop() {  
  3.     super.onStop();  // Always call the superclass method first   
  4.   
  5.     // 保存当前笔记草稿,确保不丢失工作进度。   
  6.     ContentValues values = new ContentValues();  
  7.     values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());  
  8.     values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());  
  9.   
  10.     getContentResolver().update(  
  11.             mUri,    // The URI for the note to update.   
  12.             values,  // The map of column names and new values to apply to them.   
  13.             null,    // No SELECT criteria are used.   
  14.             null     // No WHERE columns are used.   
  15.             );  
  16. }  

当activity被停止后,activity对象被保持在内存中,等待被呼叫恢复到Resumed状态,当恢复时你不需要重新创建activity和初始化组件。系统会保持每个View的当前状态,所以当用户输入内容到EditText时,内容会被自动保存,你不需要手动保存和恢复它。

  • 1
  • 2
  • 下一页

相关内容