停止并重新开始Activity
2016-06-01 17:52
381 查看
停止并重新开始Activity
本课程将向您展示如何
停止Activity开始/重新开始Activity
您还应阅读
Activity
试一试
下载演示ActivityLifecycle.zip
正确停止和重新开始Activity是Activity生命周期中的重要过程,其可确保您的用户知晓应用始终保持Activity状态并且不会丢失进度。有几种Activity停止和重新开始的关键场景:
用户打开“最近应用”窗口并从您的应用切换到另一个应用。当前位于前台的您的应用中的Activity将停止。 如果用户从主屏幕启动器图标或“最近应用”窗口返回到您的应用,Activity会重新开始。
用户在您的应用中执行开始新Activity的操作。当第二个Activity创建好后,当前Activity便停止。 如果用户之后按了返回按钮,第一个Activity会重新开始。
用户在其手机上使用您的应用的同时接听来电。
Activity课程提供两种生命周期方法:
onStop()和
onRestart(),这些方法允许您专门处理正在停止和重新开始的Activity。
不同于识别部分 UI 阻挡的暂停状态,停止状态保证 UI 不再可见,且用户的焦点在另外的Activity(或完全独立的应用)中。
注意:因为系统在停止时会将您的
Activity实例保留在系统内存中,您根本无需实现
onStop()和
onRestart()或甚至
onStart()方法。对于大多数相对简单的Activity而言,
Activity将停止并重新开始,并且您可能只需使用
onPause()暂停正在进行的操作,并从系统资源断开连接。
图 1.用户离开Activity时,系统会调用
onStop()停止Activity(1)。
如果用户在Activity停止时返回,系统会调用
onRestart()(2),紧接着调用
onStart()(3)
和
onResume()(4)。 注意:无论什么场景导致Activity停止,系统始终会在调用
onStop()之前调用
onPause()。
停止Activity
当您的Activity收到onStop()方法的调用时,它不再可见,并且应释放几乎所有用户不使用时不需要的资源。
一旦您的Activity停止,如果需要恢复系统内存,系统可能会销毁该实例。 在极端情况下,系统可能会仅终止应用进程,而不会调用Activity的最终
onDestroy()回调,因此您使用
onStop()释放可能泄露内存的资源非常重要。
尽管
onPause()方法在
onStop()之前调用,您应使用
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继续时被再次调用。
您无需重新初始化在任何导致进入“继续”状态的回调方法过程中创建的组件。 系统还会在布局中跟踪每个
View的当前状态,如果用户在
EditText小工具中输入文本,该内容会保留,因此您无需保存即可恢复它。
注意:即使系统在Activity停止时销毁了Activity,它仍会保留
Bundle(键值对的二进制大对象)中的
View对象(比如
EditText中的文本),并在用户导航回Activity的相同实例时恢复它们
(下一堂课 讲述更多有关在您的Activity被销毁且重新创建的情况下使用
Bundle保存其他数据状态的知识)。
开始/重新开始Activity
当您的Activity从停止状态返回前台时,它会接收对onRestart()的调用。系统还会在每次您的Activity变为可见时调用
onStart()方法(无论是正重新开始还是初次创建)。
但是,只会在Activity从停止状态继续时调用
onRestart()方法,因此您可以使用它执行只有在Activity之前停止但未销毁的情况下可能必须执行的特殊恢复工作。
应用需要使用
onRestart()恢复Activity状态的情况并不常见,因此没有适用于一般应用群体的任何方法指导原则。
但是,因为您的
onStop()方法应基本清理所有Activity的资源,您将需要在Activity重新开始时重新实例化它们。
但是,您还需要在您的Activity初次创建时重新实例化它们(没有Activity的现有实例)。 出于此原因,您应经常使用
onStart()回调方法作为
onStop()方法的对应部分,因为系统会在它创建您的Activity以及从停止状态重新开始Activity时调用
onStart()。
例如,因为用户可能在回到它之前已离开应用很长时间,
onStart()方法是确认所需系统功能已启动的理想选择:
@Override protected void onStart() { super.onStart(); // Always call the superclass method first // The activity is either being restarted or started for the first time // so this is where we should make sure that GPS is enabled LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!gpsEnabled) { // Create a dialog here that requests the user to enable GPS, and use an intent // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action // to take the user to the Settings screen to enable GPS when they click "OK" } } @Override protected void onRestart() { super.onRestart(); // Always call the superclass method first // Activity being restarted from stopped state }
当系统销毁您的Activity时,它会调用您的
Activity的
onDestroy()方法。因为您通常应已使用
onStop()释放大多数您的资源,到您接收对
onDestroy()的调用时,大多数应用无需做太多操作。
此方法是您清理可导致内存泄露的资源的最后一种方法,因此您应确保其他线程被销毁且其他长期运行的操作(比如方法跟踪)也会停止。
原文地址
相关文章推荐
- leetcode 4.Median of Two Sorted Arrays
- cocos2d-x 中lua自动控制label宽度(适用于多国语言版)
- Spring RMI学习
- 欢迎使用CSDN-markdown编辑器
- 第十三周项目三-形状类族中的纯虚函数
- js 计算时间
- C# []、List、Array、ArrayList 区别及应用
- leetcode Construct Binary Tree from Preorder and Inorder Traversal
- 最简单的antd的index.jsx的路由配置
- ios学习--网络流量统计
- Activity生命周期管理~ 暂停和继续Activity
- hdu1150(二分图最小顶点覆盖)
- java日期工具类
- WPS是个坑
- 编译原理 - 在 Windows 平台下使用 Flex 和 Bison
- 添加当前程序到设备管理列表里
- 筋斗云教程(一): 运行筋斗云应用
- Node.js(1)
- IO流—File
- 各种排序算法的分析及其Java代码的实现