【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 ...
随机推荐
- 增强for循环 -- foreach循环
1 作用 简化迭代器的书写格式.(注意:foreach循环的底层还是使用了迭代器遍历.) 2 适用范围 如果是实现了Iterable接口的对象或者是数组对象都可以使用foreach循环. 3 格 ...
- System.load 与 System.loadLibrary 的使用
相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...
- NancyFx 2.0的开源框架的使用-Caching
新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...
- Source Insignt注册码
分享一下google来的 呵呵 Source Insight,一个无比强大的工具.一个很好的查看代码的工具.到它的官网上去看一下,就知道,世界上基本上所有的大的软件公司,都在用这个工具.习惯了这个工具 ...
- Unable open dabase as spfile parameter incorrect
Error desc: ORA-00821: Specified value of sga_target 16M is too small, needs to be at least 4832M ...
- Zookeer-- 上搭建 hbase
一.HBase的相关概念1.HBase的概念:大量数据进行随机近实时读写时使用Hbase.2.HBase是一个模仿Gootable's Bigtable的,开源的.分布式的.版本化的非关系型数据库.3 ...
- ActionBar 通用方法
自定义actionBar布局:标题居中,左边有返回按键 <?xml version="1.0" encoding="utf-8"?> <Rel ...
- swift学习 - 计时器
swift学习之计时器 这个demo主要学习在swift中如何操作计时器(Timer),按钮(UIButton),文本(Label) 效果图: 代码 import UIKit class ViewCo ...
- Python之日志处理(logging模块)
本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日 ...
- koa-router中路由/后面不填参数就会报404的解决办法
koa-router 中使用路由参数时会遇到一个问题,就是像下面的代码在没有传入 id 是会报 404 错误 router.get('/:id', (err, ctx, next) => { / ...