Android学习路线(十四)Activity生命周期——停止和重新启动(Stopping and Restarting)一个Activity
正确地停止和重新启动你的activity在activity的生命周期中是一个非常重要的过程。这样可以确保你的用户感觉到你的应用一直都活着而且没有丢失进度。你的activity的停止和重新启动时有几个重要的场景:
- 用户打开近期执行应用的窗体而且切换到其它的应用中,你当时在前台的activity被停止了。假设用户从主界面回到你的应用,这个activity将重新启动。
- 用户在你的应用中执行一个操作跳转到其它的应用中。
当第二个activity启动时,当前的activity被停止。
假设用户之后点击返回键。第一个activity就会重新启动。
- 当用户在使用你的应用时接到一个电话。
Activity 类提供了这两个生命周期方法,onStop() 和onRestart(),来同意你指定怎样处理activity被停止和重新启动的情况。不像暂停状态。有一部分UI被遮挡,停止状态下UI全然不可见,同一时候用户的焦点在还有一个activity上(或者还有一个应用)。
提示: 因为当应用被停止时系统用仍然将你的Activity 的实例保存在系统内存中。你全然没有必要实现onStop() 和onRestart()(或者甚至onStart() )方法。对于大多数相对简单的activity来说,activity会非常正常的停止和重新启动。你可能仅仅须要使用onPause() 方法来暂停正在进行的操作以及切断对系统资源的使用。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3dlZXR2dmNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="662" height="306" alt="" style="border:0px; vertical-align:middle; max-width:100%; margin-bottom:15px; color:rgb(34,34,34); font-family:Roboto,sans-serif; font-size:14px; line-height:19px; background-color:rgb(249,249,249)">
图 1. 当用户离开你的activity,系统调用onStop() 方法来停止你的(1)。假设用户回到被停止的activity中。系统会调用onRestart() 方法(2),非常快会接着调用onStart() (3)和onResume() 方法(4)。注意无论是哪个场景导致activity停止,系统总是会在调用onStop()方法之前先调用onPause()方法。
停止一个Activity
当你的activity接收到onStop() 方法的回调,因为用户不再使用它,这个activity不再可见而且须要释放差点儿全部它不再须要的资源。一旦你的activity被停止。系统可能会销毁它的实例假设系统须要回收内存。
在极端情况下,系统可能会简单的杀死你的应用的进程而不调用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 对象保持常驻内存,在activity恢复后会再次被使用到。你不必又一次初始化在不论什么回调方法中创建的组件来到达Resumed状态。
系统也不会保存布局中每一个视图的栈,因此假设用户向EditText 部件中写入了数据,那么这些内容会被保存起来,你没有必要保存以及又一次加载它们。
提示: 甚至是当系统销毁了你的activity在它停止的时候,系统仍然记录着视图对象的状态(比如EditText中的文本)到一个 Bundle 中(一个key-value
对块)而且在用户回到同样的activity实例时又一次加载它们(下堂课会介绍很多其它怎样使用Bundle 来保存数据状态,在你的activity被销毁核又一次创建的时候)。
开启/重新启动你的Activity
当你的activity从停止状态又一次回到前端时,它会收到onRestart()回调。系统同一时候还会调用onStart() 方法。activity每次变可见的时候都会调用这种方法(无论是被重新启动还是第一次被创建时)。
然而onRestart() 方法仅仅会在用户从停止状态恢复时才会被调用,因此你能够使用它来运行一些之前activity被停止前没有被销毁。
一个应用须要使用onRestart() 方法来又一次加载activity的状态的做法是不常见的。因此没有不论什么对这种方法的指引。被应用到通用人群的应用中。
然而。因为你须要在onStop() 方法中清理你的activity的资源你须要在activity重新启动时又一次初始化他们。你相同须要在你的activity第一次被创建时初始化它们(当已经没有这个activity的实例时)。鉴于这个原因,在从停止状态创建或者重新启动你的activity时,你应该使用onStart() 方法来相应onStop() 方法。
比如。用户可能在他再次回到你的应用之间过了非常久,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,它会调用onDestroy() 方法。因为你通常应该在onStop()方法中释放了大部分的资源,当系统调用onDestroy()时就没有太多的东西须要做。这种方法是清理可能导致内存泄漏的最后的方法,因此你须要确保那些附加线程以及其它的长时间操作(像方法跟踪)都被停止。
Android学习路线(十四)Activity生命周期——停止和重新启动(Stopping and Restarting)一个Activity的更多相关文章
- android 学习随笔十四(页面跳转与数据传递)
1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...
- 零基础Android学习笔记-02 安卓程序生命周期
一个安卓程序生命周期会经历7中状态,并不一定是每次都全部经历.Create,Start,ReStart,Pause,Resume,Stop,Destory. 重载方法,用helloWorld程序去体验 ...
- maven学习(十)——maven生命周期以及插件
一.生命周期 1.何为生命周期? Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤 2.Maven三大生命周期 Maven有三套 ...
- Android学习(十四) Service组件
一.定义 运行在后台,没有页面,不可见.优先级高于Activity,当系统内存不足时,会先释放一些Activity.注意,Service同样是运行在主线程中,不能做一些耗时操作.如果一定要做一些耗时的 ...
- android学习笔记28——Activity生命周期
Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...
- Android编程: Activity生命周期和LogCat使用
学习内容:Activity生命周期和LogCat使用 ====Activity生命周期==== 图示(转载): 创建 onCreate重启 onRestart开始 onStart恢复 ...
- 浅谈Android之Activity生命周期
Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...
- Android Activity生命周期的几个问题
每一个Android开发者都应该知道,android系统有四个重要的基本组件,即Activity(活动).Service(服务).Broadcast Receive(广播接收器)和Content ...
- Android Activity生命周期详讲
管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...
随机推荐
- BZOJ5204: [CodePlus 2018 3 月赛]投票统计
[传送门:BZOJ5204] 简要题意: 有n个选手,每个选手会选择一道题投票,求出投票最多的题目个数和这些题目的编号,如果所有题目的投票数相同,则输出-1 题解: 直接搞 离散化,然后判断就可以了 ...
- 2.cocos设置背景图片
在bool HelloWorld::init()中加入如下代码 auto bg = Sprite::create("1.jpg"); if (bg) { bg->setPos ...
- Gym - 100338C Important Roads 最短路+tarjan
题意:给你一幅图,问有多少条路径使得去掉该条路后最短路发生变化. 思路:先起始两点求两遍单源最短路,利用s[u] + t[v] + G[u][v] = dis 找出所有最短路径,构造新图.在新图中找到 ...
- OPENCV(3) —— 对XML和YAML文件实现I/O 操作
XML\YAML文件在OpenCV中的数据结构为FileStorage string filename = "I.xml"; FileStorage fs(filename, Fi ...
- vi命令常用操作
一.vi的操作模式 vi提供两种操作模式:输入模式(insert mode)和指令模式(command mode).在输入模式下,用户可输入文本资料.在指令模式下,可进行删除.修改等各种编辑动作. ...
- php获取csv数据无乱码
<?php //获取csv数据 function csvencode($file){ if(!is_file($file['tmp_name'])){ ...
- Springboot集成mybatis通用Mapper与分页插件PageHelper
插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 Example 相关的单表操作.通用 Mapper 是为了解决 MyBatis 使用 ...
- HTML5吃豆豆游戏开发实战(一)使用Canvas绘制游戏主角
近期在学习HTML5.爱因斯坦曾说过,"最好的学习就是自己去经历". 于是.我想在学习HTML5的同一时候.做一款简单的小游戏,这样学习起来也会非常有趣的.我想做的是曾经小时候玩儿 ...
- Vue v-if v-for v-bind v-on
v-if <div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'&q ...
- Impala储存与分区
不多说,直接上干货! hive的元数据存储在/user/hadoop/warehouse Impala的内部表也在/user/hadoop/warehouse. 那两者怎么区分,看前面的第一列. 下面 ...