【Android Developers Training】 17. 停止和重启一个Activity
注:本文翻译自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的更多相关文章
- 【Android Developers Training】 18. 重新创建一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 14. 序言:管理Activity生命周期
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 0. 序言:构建你的第一个应用
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 95. 创建一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 16. 暂停和恢复一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 15. 启动一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 21. 创建一个可变动的UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- SQL SERVER大话存储结构(3)_数据行的行结构
一行数据是如何来存储的呢? 变长列与定长列,NULL与NOT NULL,实际是如何整理存放到 8k的数据页上呢? 对表格进行增减列,修改长度,添加默认值等DDL SQL ...
- 【PHP】PHP从入门到精通(一)——想学习PHP的小伙伴的福利来了!
PHP从精通到入门 (一)PHP简介和基本知识 PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸 ...
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- Hibernate与Jpa的关系(1)
[转自:http://freewind.me/blog/20111129/588.html ] 我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseL ...
- JAVA网络编程TCP通信
Socket简介: Socket称为"套接字",描述IP地址和端口.在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端 ...
- Linux下让一个程序开机自动启动
1.chkconfig但是要在脚本中满足一定的条件(/etc/init.d/)下存在相关服务 2.将启动的程序写入到/etc/rc.local 选择建议: /etc/rc.local可以作为开机启动程 ...
- 侯捷STL学习(二)
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
- xcode8.3 shell 自动打包脚本 记录
题记 xcode升级8.3后发现之前所用的xcode自动打包基本无法使用,因此在网上零碎找到些资料,将之前的脚本简化.此次脚本是基于xcode证书配置进行打包(之前是指定描述文件.相对繁琐).因此代码 ...
- Windows7 安装完成mysql dos启动服务出现服务名称无效
错误提示: WIN 7 cmd命令行下,net start mysql,出现 服务名无效提示: 错误分析: Mysql服务未安装 解决方案:在mysql 安装目录下bin文件夹 安装Shift+鼠 ...
- 使用FlashWavRecorder实现浏览器录制wav音频和上传音频文件,兼容IE8以上浏览器
前言:本项目基于github开源插件实现,该插件使用flash实现,兼容IE8以上浏览器 感谢michalstocki的分享该项目,github项目地址:https://github.com/mich ...