注:本文翻译自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. CentOS6.5_x86安装Mysql5.5.49

    1.说明: 安装MySQL主要有两种方法:一种是通过源码自行编译安装,这种适合高级用户定制MySQL的特性,这里不做说明:另一种是通过编译过的二进制文件进行安装.二进制文件安装的方法又分为两种:一种是 ...

  2. Windows安装Mysql5.7.10绿色版

    今天在Windows上安装Mysql的时候,去官网上下了一个最新版本的Mysql5.7.10绿色版,但是之前网上安装方式都过时了,比如会报一些常见的错误“[ERROR] Fatal error: Ca ...

  3. 基于本地文件系统的LocalDB

    零.前言 之前写一些小工具的时候,需要用到数据存储方面的技术,但是用数据库又觉得太大了,本地文件存储txt文件存储又不是很规范,于是乎想到了去编写一个简单的基于本地文件系统的数据存储库,暂且叫它loc ...

  4. C#在属性中用Lambda语法

    今天看代码改功能的时候遇到了个比较奇怪的地方,在属性里也能用Lambda,我看了好久,也不是很理解,我都开始怀疑这是不是属性了,又在群里讨论了下这个问题,觉得有必要记下来,因为又涨知识了. 问题1:这 ...

  5. 无锁atomicInteger

    AtomicInteger可以保证硬件上的原子操作 1.主要原理 CAS操作 在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败,  ...

  6. Unity 遮罩 点击panel以外的位置,panel关闭

    public Class Panel_ATMRechage : IPanel{ private Dictionary<string,UISprite>mSprites; } protect ...

  7. Git添加远程库和从远程库中获取(新手傻瓜式教学)

    一.    Git添加远程库 1.在本地新建一个文件夹,在该文件夹使用Git工具,运行$ git init,将该文件夹变为本地Git仓库,同时会生成一个隐藏的.git文件夹. 2.在该文件夹中用Not ...

  8. c语言项目开发流程二部曲

    一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐. 6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口. /**************函数 ...

  9. react router 4.0以上的路由应用

    thead>tr>th{padding:8px;line-height:1.4285714;border-top:1px solid #ddd}.table>thead>tr& ...

  10. 学习笔记TF016:CNN实现、数据集、TFRecord、加载图像、模型、训练、调试

    AlexNet(Alex Krizhevsky,ILSVRC2012冠军)适合做图像分类.层自左向右.自上向下读取,关联层分为一组,高度.宽度减小,深度增加.深度增加减少网络计算量. 训练模型数据集 ...