注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/basics/activity-lifecycle/stopping.html


正确地停止和重启你的activity在整个生命周期过程中是非常重要的,它可以让用户感觉到你的应用一直处于活跃状态,并且不会丢失他们的进度。以下是一些你的activity被停止或者被重启的例子:

  • 用户打开了最近使用过的应用窗口,并且从你的应用切换到了另一个应用。此时你的处于前台的activity被停止。如果用户从主菜单页面或者最近使用过的应用窗口回到你的应用,此时之前被停止的activity会被重启。
  • 用户在你的应用中进行了一个启动另一个新activity的操作。当新activity被创建时,当前的activity会被停止。如果用户此时按下返回键,第一个activity会被重启。
  • 当用户在使用你的应用时接到了电话

Activity类中的两个生命周期函数onStop()onRestart(),使你可以在activity被停止或被重启时,进行一些处理。不像在暂停态时,activity是部分可见的。停止态时的activity是完全不可见的,同时用户的焦点也在另一个activity上(或另一个应用上)。

Note:

因为当Activity被停止时,系统在RAM中保存了它的实例,所以有可能你并不需要实现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()中释放资源来防止内存泄露。

虽然onPause()onStop()之前被调用,你应该在onStop()中进行负荷更大,更消耗CPU的操作,比如把信息写入数据库。

例如,以下是一个onStop()的实现,它将一段内容的草稿存到手机存储当中:

  1. @Override
  2. protected void onStop() {
  3. super.onStop(); // Always call the superclass method first
  4.  
  5. // Save the note's current draft, because the activity is stopping
  6. // and we want to be sure the current note progress isn't lost.
  7. ContentValues values = new ContentValues();
  8. values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
  9. values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
  10.  
  11. getContentResolver().update(
  12. mUri, // The URI for the note to update.
  13. values, // The map of column names and new values to apply to them.
  14. null, // No SELECT criteria are used.
  15. null // No WHERE columns are used.
  16. );
  17. }

当你的Activity被停止时,activity对象会保存在存储中,并且当它恢复时,会从存储中重新调用。你不需要再重新初始化那些进入恢复态之前的所有回调函数中已经创建好了的组件。系统也会在一个Bundle(一种键值对)中对布局中的每一个View记录好它的状态(如EditText中的文字)。并且当用户回到相同的activity实例时,恢复它们。(下一节课会继续讨论使用Bundle来存储其它的数据,防止你的activity被销毁或重新创建)。

二). 启动/重启你的Activity

当你的activity从停止态回到前台,它会调用onRestart()方法。系统也同时会调用onStart()方法,该方法每当你的activity变为可见时会调用(不管是被重新启动的还是被第一次创建的)。然而,onRestart()方法只在activity从停止态恢复时才会被调用,所以你可以用它来实现一些特殊的恢复工作,这些工作也许仅在activity之前被停止,但没有被销毁时,有着特殊的作用。

对于一个应用来说,使用onRestart()方法来恢复状态看上去不太寻常,所以关于这个方法应该如何使用,没有一个指导性的建议。不过,因为你的onStop()方法会清除你的activity的大部分资源,因此当activity重启时,你需要重新初始化它们。然而另一方面,当activity第一次被创建时(即没有该activity已经存在的实例),你也需要初始化它们。所以,你应该经常使用onStart()方法来和onStop()方法相对应,因为在上述两种情况下(activity从停止态恢复和第一次被创建),系统都会调用onStart()方法。

例如,因为用户可能在回到你的应用之前已经离开你的应用很久了,在onStart()方法中检查一些需要的系统功能是否可以被调用是一个不错的方法:

  1. @Override
  2. protected void onStart() {
  3. super.onStart(); // Always call the superclass method first
  4.  
  5. // The activity is either being restarted or started for the first time
  6. // so this is where we should make sure that GPS is enabled
  7. LocationManager locationManager =
  8. (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  9. boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
  10.  
  11. if (!gpsEnabled) {
  12. // Create a dialog here that requests the user to enable GPS, and use an intent
  13. // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
  14. // to take the user to the Settings screen to enable GPS when they click "OK"
  15. }
  16. }
  17.  
  18. @Override
  19. protected void onRestart() {
  20. super.onRestart(); // Always call the superclass method first
  21.  
  22. // Activity being restarted from stopped state
  23. }

当系统销毁了你的activity时,它会对你的activity调用onDestroy()方法。因为你已经在onStop()方法中释放了几乎所有占用的资源,故当被调用onDestroy()方法时,其实大多数应用没有什么特别需要做的。这个方法是你清除那些可能会导致内存泄露的资源的最后机会,所以你应该确定那些额外的线程被清除,并且那些长时间运行的操作,如函数追踪器也被停止了。

【Android Developers Training】 17. 停止和重启一个Activity的更多相关文章

  1. 【Android Developers Training】 18. 重新创建一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 14. 序言:管理Activity生命周期

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 0. 序言:构建你的第一个应用

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 95. 创建一个同步适配器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 16. 暂停和恢复一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 15. 启动一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 21. 创建一个可变动的UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. xpo-4大类

      Xpo (XPBaseObject.XPLiteObject.XPCustomObject.XPObject) 类名 延后删除 是否乐观锁定 提供OID字段 XPBaseObject 不支持 支持 ...

  2. 数据库安全性操作——操作原则及SQL注入

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6893134.html 今天在进行支付宝开发时,看到支付宝开发文档<开放平台第三方应用安全开发指南> ...

  3. 使用公共 Registry - 每天5分钟玩转 Docker 容器技术(19)

    保存和分发镜像的最直接方法就是使用 Docker Hub. Docker Hub 是 Docker 公司维护的公共 Registry.用户可以将自己的镜像保存到 Docker Hub 免费的 repo ...

  4. struts2.1.6教程五、拦截器

    在前面我们已经初步使用过拦截器,下面继续细细探讨. 1.概述strust2中的拦截器 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给Action属性.执行数据校验.文件上传 ...

  5. spring-线程池(2)

    继承:http://www.cnblogs.com/crazylqy/p/4220743.html spring设置容器启动时运行线程类(可循环执行) 修改以下两文件, 1.spring设置容器启动时 ...

  6. 开涛spring3(4.2) - 资源 之 4.2 内置Resource实现

    4.2  内置Resource实现 4.2.1  ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个By ...

  7. Introducing: Machine Learning in R(转)

    Machine learning is a branch in computer science that studies the design of algorithms that can lear ...

  8. 每天一道Java题[11]

    题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...

  9. ProxySQL的相关维护说明

    背景: 前面的2篇文章MySQL ProxySQL读写分离使用初探和MySQL ProxySQL读写分离实践大致介绍了ProxySQL的使用说明,从文章的测试的例子中看到ProxySQL使用SQLIT ...

  10. xcode8.3 shell 自动打包脚本 记录

    题记 xcode升级8.3后发现之前所用的xcode自动打包基本无法使用,因此在网上零碎找到些资料,将之前的脚本简化.此次脚本是基于xcode证书配置进行打包(之前是指定描述文件.相对繁琐).因此代码 ...