编辑: glay | 2014-02-25 |
结束 Activity 2. 启动/重新启动 Activity 扩展阅读 ? Activities 正确地结束并重启 activity 在其生命周期中是一个重要的过程,它可以确保用户感知到你的 应用处于活跃状态、而没有丢失用户进度.下面是一些 activity 被结束并重启的场景: ? 用户打开最近使用的应用列表窗口, 从你的应用切换到另一应用, 前台的 activity 被结束;
如果用户从主屏幕图标或者最近使用应用列表回到你的应用,activity 重启. ? 用户执行了启动新 activity 的操作, 在新 activity 创建后当前 activity 被结束. 若用户点击 后退按钮,第一个 activity 重启. ? 用户在使用应用的过程中接到电话, activity 被结束, 挂掉电话回到应用时 activity 重启. Activity 类提供
2 个生命周期方法 onStop()和onRestart(),从而允许自定义 activity 结束和重启时的操作.和Paused 态activity 被阻塞部分 UI 不同,Stopped 态下 UI 是不可 见的,用户焦点在另一个 activity 或完全不同的应用上. 注意:因为 activity 结束时系统在内存中保留了 Activity 实例, 所以可能无需实现 onStop() 和onRestart()方法(甚至 onStart()方法也无需实现, 对于大部分相对简单的 activity 来说,它们只是停止和重新启动,唯一需要做的就是在 onPause()方法中暂停正在进行的操 作并释放系统资源) 图1. 当用户离开 activity,系统调用 onStop()结束 activity (1). 若用户回到已停止的 activity, 系统调用 onRestart()(2),接着调用 onStart()(3)和onResume() (4). 注意,无论何种场 景引起 activity 停止,系统在调用 onStop()前总是调用 onPause() 结束 Activity 当activity 接到对 onStop()的调用就不再可见,此时应释放所有用户不再使用的资源.一旦activity 结束,系统可能在需要恢复内存空间时销毁其实例(不可预知).极端情况下, 系统可能在不调用 onDestroy()的情况下直接关闭应用进程.所以使用 onStop()方法释 放资源以防内存泄露是非常重要的. 尽管在调用 onStop()前会调用 onPause()方法, 但还是应该使用 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 部件,其内容会在内存中保留而无需手动 保存和恢复. 注意: 即使系统在 activity 停止时销毁了 activity 实例,它仍然保留 View 对象的状态(如EditText 中的文本)到Bundle(大量的键值对集合),并在用户回到同一个 activity 实例 时恢复它们(下一课将会讲解如何使用一个 Bundle 在activity 被销毁时保存状态数据). 启动/重启 Activity 当activity 从Stopped 态回到前台,它会收到对 onRestart()方法的调用,系统也会调用 onStart()方法(只要 activity 变为可见状态都会调用,无论是重启还是初次创建).而onRestart()方法仅在 activity 从Resumed 态恢复时被调用,因此可在其中执行那些先前 被结束但没有被销毁的 activity 的特殊的恢复工作. 对于一个应用来说,使用 onRestart()方法恢复 activity 状态并不常见,因此没有这方面 的指导.但因为 onStop()方法实质上应该清理所有的 activity 资源,所以在 activity 重启时 需要重新初始化这些资源,而在 activity 初次创建的时候也必须对它们进行初始化,因此通 常对应 onStop()方法使用 onStart(), 因为系统总是在创建 activity 或从 Stopped 态重启 时调用 onStart()方法. 例如,因为用户在重新回到 activity 前可能已经离开应用很长一段时间,所以 onStart() 方法是验证系统特性是否启用的好地方: @Override protected void onStart() { super.onStart();