Android-管理Activity生命周期 -停止和重启Activity
停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度。activity在下面的这些情况会停止和重启:
用户打开常用app窗口然后从你的app切换到其他app。你的app中的activity现在就在后台了而且停止了。如果用户从主屏的启动图标或者最近使用的app窗口返回到你的app,这个activity就会重启。
用户在你的程序中执行了一个操作来启动一个新的activity。当前的activity在第二个activity创建时就会停止了。如果用户点击了返回按钮,第一个activity就重启了。
用户在使用你的app时接到电话。
注意:因为当activity停止时系统在系统内存中保留了实例,可能不需要实现onStop()和onRestart()甚至onStart()方法。对于大多数activity来说相对简单,activity会很好的停止和重启,你只需要使用onPause()来暂停正在执行的操作和断开与系统资源的连接。

图1.当用户离开activity,系统会调用onStop()来停止activity。如果activity停止后用户返回,系统会调用onRestart(),然后紧接着onStart()和onResume()。注意不管是什么情况导致activity要停止,系统总是会在调用onStop()前调用onPause()。
停止Activity
当activity被调用onStop()方法后,它不在可见并且需要释放用户不使用的绝大多数资源。一旦activity停止了,系统可能会在清理内存时销毁实例。在极端的情况下,系统可能不调用onDestroy()直接杀掉app进程,所有用onStop()来释放资源防止内存泄漏很重要。
虽然在onStop()之前调用了onPause()方法,你应该使用onStop()来处理大部分消耗CPU的操作,比如写入信息到数据库。
这里有一个实现onStop()的例子,它把笔记草稿保存的永久的存储中:
@Override
protected void onStop() {
super.onStop(); // Always call the superclass method first // 保存笔记草稿,因为activity将要停止
// 我们要保证当前的笔记进度不丢失
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对象保存在内存中,当activity恢复时会被再调用。不需要在任何的回调方法中重新初始化组件来回到Resumed状态。系统也记录了layout中每个View的状态,所以如果用户在EditText控件中输入了文字,这些内容会被保留,所以你不需要保存和还原它。
注意:虽然系统在activity停止时销毁了它,但是仍然在Bundle(一系列的键值对)中保存这View对象(比如EditText中的文字)的状态然后在用户切换回原来的activity时恢复他们。(后面会讲更多的关于使用Bundle在activity销毁和再创建时保存状态数据)
开始/重启Activity
当activity从停止状态返回到前台,它收到onRestrart()调用。系统也会调用onStart()方法,每次activity变成可见时都会调用(不管时被重启还是第一次创建)。这个onRestart()方法,只有在activity从停止状态恢复时才会调用,所以你可以用它做一些特殊的恢复操作只要activity之前被停止了并且没有销毁。
app使用onRestart()来恢复activity的状态不常见, 所以没有使用这个方作作为app入口的讲解。但是,因为onStop()方法本质上清理掉了activity的资源,你需要在activity重启的时候需要重新实例化他们。第一次创建的时候也需要实例化他们(当没有存在的实例时)。由于这个原因,你应该使用onStart()方法对应onStop()方法,因为系统在创建activity和从停止状态重启时都会调用onStart()。
例如,由于用户在回来app之前已经没有进入app很长时间了,onStart()方法是一个查看系统功能是否可用的好地方:
@Override
protected void onStart() {
super.onStart(); // Always call the superclass method first // activity可能是重启也可能是第一次启动
// 所以在这里我们应该确保GPS功能可用
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()调用时,大多数app不需要做什么了。这个方法时清理资源防止内存泄漏的最后机会,所以需要确保被添加的线程被销毁了还有长时间运行的操作(比如追踪方法)也被停止了。
上一篇:Android-管理Activity生命周期 -暂停和恢复一个Activity
下一篇:Android-管理Activity生命周期 -重新创建Activity
Android-管理Activity生命周期 -停止和重启Activity的更多相关文章
- Android-管理Activity生命周期 -重新创建Activity
按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...
- Android-管理Activity生命周期 -开始一个Activity
很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...
- Android学习路线(十四)Activity生命周期——停止和重新启动(Stopping and Restarting)一个Activity
正确地停止和重新启动你的activity在activity的生命周期中是一个非常重要的过程.这样可以确保你的用户感觉到你的应用一直都活着而且没有丢失进度.你的activity的停止和重新启动时有几个重 ...
- Android-管理Activity生命周期 -暂停和恢复一个Activity
在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...
- Android学习整理之Activity生命周期篇
一.Activity生命周期说明 Activity的四种状态: ⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能 ...
- Android体系结构及activity生命周期
Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核 Android的系统架构图 每层 ...
- Android-管理Activity生命周期
用户在浏览,退出,返回app时,app中的Activity实例会在不同状态之间切换.比如,当activity第一次启动,然后来到系统前台,受到用户的注意,这个过程中,android系统调用了一系列ac ...
- 【Android Developers Training】 14. 序言:管理Activity生命周期
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
随机推荐
- Matlab---串口操作---数据採集篇
matlab功能强大,串口操作也非常easy.相信看过下面两个实验你就能掌握咯! 開始吧! 实验1: 从电脑COM2口读取数据.并将数据保存在TXT文件里,方便数据分析,以下是M脚本: %名 称:Ma ...
- BZOJ 1176([Balkan2007]Mokia-CDQ分治-分治询问)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 185 Solved: 94 [ Submit] ...
- hdu2126(求方案数的01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...
- Codeforces Round #253 DIV1 C 馋
http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...
- GDAL切割重采样遥感图像
一个小测试程序开发全过程实录,完全新手入门级的实例,如果你还在为处理大影像而发愁,来试试这个称手的工具吧. Imagec 开发日记 2013-6-25 需求: 影像数据切割,重采样 数据切割的要求是简 ...
- vb.net版机房收费——助你学会七层架构(一)
我自己写机房的时候,看非常多高人的博客,各种的借鉴,当初务必的纠结,如今整个机房敲完了,写这篇博客给大家一个总体上的.简单理解的七层,期望大家看完这篇文章之后,不会这个纠结了. 首先大家得看了我的上一 ...
- Maven 中配置 Urlrewrite 基本配置
1. 在maven项目的pom.xml文件里加入: <!-- URL Rewrite --> <dependency> <groupId>org.tuckey< ...
- 泛型Binary Search Tree实现,And和STL map比较的经营业绩
问题叙述性说明: 1.binary search tree它是一种二进制树的.对于key值.比当前节点左孩子少大于右子. 2.binary search tree不是自平衡树.所以,当插入数据不是非常 ...
- c语言移位操作
应该先看看C语言是指所有的位二进制算术位计算.即使输入的是十进制的数,在存储器存储为二进制形式. “<<”使用方法: 的格式是:a<<m,a和m式,要求m>=0. 功能: ...
- Linux下一个C(编程入门.h档,.c档,而路多文件的调用)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0 ...