注:本文翻译自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()的实现,它将一段内容的草稿存到手机存储当中:

@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对象会保存在存储中,并且当它恢复时,会从存储中重新调用。你不需要再重新初始化那些进入恢复态之前的所有回调函数中已经创建好了的组件。系统也会在一个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()方法中检查一些需要的系统功能是否可以被调用是一个不错的方法:

@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()方法时,其实大多数应用没有什么特别需要做的。这个方法是你清除那些可能会导致内存泄露的资源的最后机会,所以你应该确定那些额外的线程被清除,并且那些长时间运行的操作,如函数追踪器也被停止了。

【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. struts2.1.6教程二、struts.xml配置及例程

    1.配置文件的优先级 在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,struts. ...

  2. ideal导入非maven工程-zdy

    最近在老总给了一个ant部署的项目,发现ideal并没有支持ant直接一键自动配置的功能,like maven一样的,你们懂得.所以在这里记录一下我的心酸. 项目总体结构,webapp准备在ideal ...

  3. android相对布局中控件的常用属性【转】

    Android布局属性详解 RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHorizontal 水平居中 andr ...

  4. JavaScript中的该如何[更好的]做动效

    在用js写动画的时候,无非使用 setTimeout/setInterval 或者 requestAnimationFrame 来处理动画(在jquery的代码里也是这么干的),本文主要为了记录下两者 ...

  5. 在.Net下使用redis基于StackExchange.Redis

    研究了下redis在.net下的使用,因为以前在java上用redis用的是jedis操作,在.net不是很熟悉,在网站上也看了一部分的.net下redis的使用,大部分都是ServiceStack. ...

  6. python 第五弹

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  7. shiro不重启动态加载权限

    最近一朋友让我帮他做一个后台权限管理的项目.我就在我原来的项目加加改改但是还是不理想,查了不少资料也走了不了弯路...... shiro基本的配置我就不多说了这个很简单自己查查资料就完成----下面是 ...

  8. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  9. Leetcode 494 Target Sum 动态规划 背包+滚动数据

    这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20) ...

  10. ZooKeeper数据模型

    ZooKeeper有一个分层的命名空间,类似分布式文件系统.它们唯一的区别就在于在命名空间中每个节点可以有数据关联作为它们的子节点.这就像有一个文件系统允许文件也作为文件目录.节点路径通常表示为规范的 ...