恰当的停止与重启我们的activity是很重要的,在activity生命周期中,他们能确保用户感知到程序的存在并不会丢失他们的进度。在下面一些关键的场景中会涉及到停止与重启:

用户打开最近使用app的菜单并从我们的app切换到另外一个app,这个时候我们的app是被停止的。如果用户通过手机主界面的启动程序图标或者最近使用程序的窗口回到我们的app,那么我们的activity会重启。

用户在我们的app里面执行启动一个新activity的操作,当前activity会在第二个activity被创建后stop。如果用户点击back按钮,第一个activtiy会被重启。

用户在使用我们的app时接收到一个来电通话.

Activity类提供了onStop()与onRestart()方法来允许在activity停止与重启时进行调用。不同于暂停状态的部分阻塞UI,停止状态是UI不再可见并且用户的焦点转移到另一个activity中.

Note: 因为系统在activity停止时会在内存中保存Activity的实例,所以有时不需要实现onStop(),onRestart()甚至是onStart()方法. 因为大多数的activity相对比较简单,activity会自己停止与重启,我们只需要使用onPause()来停止正在运行的动作并断开系统资源链接。

Figure 1. 上图显示:当用户离开我们的activity时,系统会调用onStop()来停止activity (1). 这个时候如果用户返回,系统会调用onRestart()(2), 之后会迅速调用onStart()(3)与onResume()(4). 请注意:无论什么原因导致activity停止,系统总是会在onStop()之前调用onPause()方法。

停止activity

当activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源。一旦activity停止了,系统会在需要内存空间时摧毁它的实例(和栈结构有关,通常back操作会导致前一个activity被销毁)。极端情况下,系统会直接杀死我们的app进程,并不执行activity的onDestroy()回调方法, 因此我们需要使用onStop()来释放资源,从而避免内存泄漏。(这点需要注意)

尽管onPause()方法是在onStop()之前调用,我们应该使用onStop()来执行那些CPU intensive的shut-down操作,例如往数据库写信息。

例如,下面是一个在onStop()的方法里面保存笔记草稿到persistent storage的示例:

@Overrideprotected voidonStop() {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 = newContentValues();

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 resume时被重新调用。我们不需要在恢复到Resumed state状态前重新初始化那些被保存在内存中的组件。系统同样保存了每一个在布局中的视图的当前状态,如果用户在EditText组件中输入了text,它会被保存,因此不需要保存与恢复它。

Note: 即使系统会在activity stop时停止这个activity,它仍然会保存View对象的状态(比如EditText中的文字) 到一个Bundle中,并且在用户返回这个activity时恢复它们(下一小节会介绍在activity销毁与重新建立时如何使用Bundle来保存其他数据的状态).

启动与重启activity

当activity从Stopped状态回到前台时,它会调用onRestart().系统再调用onStart()方法,onStart()方法会在每次activity可见时都会被调用。onRestart()方法则是只在activity从stopped状态恢复时才会被调用,因此我们可以使用它来执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。

使用onRestart()来恢复activity状态是不太常见的,因此对于这个方法如何使用没有任何的guidelines。然而,因为onStop()方法应该做清除所有activity资源的操作,我们需要在重启activtiy时重新实例化那些被清除的资源,同样, 我们也需要在activity第一次创建时实例化那些资源。介于上面的原因,应该使用onStart()作为onStop()所对应方法。因为系统会在创建activity与从停止状态重启activity时都会调用onStart()。也就是说,我们在onStop里面做了哪些清除的操作,就该在onStart里面重新把那些清除掉的资源重新创建出来。

例如:因为用户很可能在回到这个activity之前已经过了很长一段时间,所以onStart()方法是一个比较好的地方来验证某些必须的系统特性是否可用。

@Overrideprotected voidonStart() {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"

}

}

@Overrideprotected voidonRestart() {super.onRestart(); //Always call the superclass method first//Activity being restarted from stopped state

}

当系统Destory我们的activity,它会为activity调用onDestroy()方法。因为我们会在onStop方法里面做释放资源的操作,那么onDestory方法则是我们最后去清除那些可能导致内存泄漏的地方。因此需要确保那些线程都被destroyed并且所有的操作都被停止。

android activity自动重启,8) 十分钟学会android--Activity的生命周期之停止与重启相关推荐

  1. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity

    原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/stopping.html#Start 在activity的 ...

  2. 虚拟局域网软件开源_玩转虚拟机,十分钟学会一台电脑安装3个操作系统

    玩转虚拟机,十分钟学会一台电脑安装3个操作系统 本文目录 一.什么是虚拟机 1.普通虚拟机 2.Java虚拟机 二.虚拟机的作用 三.虚拟机的安装需求 四.常用的虚拟机软件 1.VMware虚拟机 2 ...

  3. 十分钟学会win10系统封装之系列教程(一):在VMware Workstation虚拟机上安装win10母盘系统

    关于系统封装这个话题,历来就一直受到很多小伙伴的青睐,很多同学都认为会封装系统是一件很高大上的事情,所以一直都有很多小伙伴向亦是美网络小编询问到底什么时候能出一些关于win10系统封装的教程,其实小编 ...

  4. 十分钟实现 Android Camera2 相机拍照

    1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更 ...

  5. 一些生活中简单可用的技能--十分钟学会,终生受益

    一些日常生活中简单可用的技能 十分钟学会,终生受益 工作 学习 生活 社交 十分钟学会,终生受益 下面的文章是从知乎高赞回答中"日常生活中有哪些十分钟就能学会并可以终生受用的技能?" ...

  6. java中xml的组装与解析(十分钟学会)

    xml的组装与解析(十分钟学会) 一.xml的解析 话不多说直接上代码 1.引入pom依赖 // 解析xml <dependency><groupId>org.jsoup< ...

  7. (十)Spring中Bean的生命周期(下)

    Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...

  8. Python + wordcloud + jieba 十分钟学会生成中文词云

    前述 本文需要的两个Python类库 jieba:中文分词分词工具 wordcloud:Python下的词云生成工具 写作本篇文章用时一个小时半,阅读需要十分钟,读完该文章后你将学会如何将任意中文文本 ...

  9. Python + wordcloud + jieba 十分钟学会用任意中文文本生成词云

    前述 本文需要的两个Python类库  jieba:中文分词分词工具  wordcloud:Python下的词云生成工具 写作本篇文章用时一个小时半,阅读需要十分钟,读完该文章后你将学会如何将任意中文 ...

最新文章

  1. 当前日期得到本周的开始和结束日期
  2. 按钮在执行frame动画的时候怎么响应触发事件?
  3. 教你解决ChartDirector Linux下中文乱码
  4. 收留我接入云信,打造陌生人旅行社交
  5. 04.local_gateway和network相关设置
  6. Introspection in Python How to spy on your Python objects Guide to Python introspection
  7. Python学习笔记——for循环和range函数
  8. linux启动mysql_Linux安装mysql
  9. code函数oracle列子,Oracle Pivot函数语法详解及应用实例
  10. steam pipeGUI
  11. 案例分析:传统媒体如何借力微信平台推广
  12. 现代软件工程 习而学的软件工程教育
  13. matlab多项式除法 分式展开,多项式除法有一种处理假分式的方法叫多项式除 – 手机爱问...
  14. MySQL学习---作业(1)
  15. 怦然心动(Flipped)-5
  16. Adobe Photoshop CC 使用过程中图层出现部分图像缺失
  17. CF1603B Moderate Modular Mode
  18. 如何安装KEIL MDK5开发软件
  19. 冰山一角 管窥中国互联网的地下世界
  20. 线下广告投放方案_线下推广方式有哪些?

热门文章

  1. 需求工程小黑指北-习题集(带答案和解析)(上)
  2. HTML5期末大作业:化妆品网站设计——大气简洁的品牌化妆品网页(7页) HTML+CSS+JavaScript web前端课程设计源码...
  3. VUE3+TS(父子、兄弟组件通信)
  4. vue兄弟组件之间的通信的使用
  5. HTML5期末大作业:动漫网站设计——动漫电影《你的名字》(7页) HTML+CSS+JavaScript 学生DW网页设计作业成品 html网页设计期末大作业_网页设计平时作业
  6. java的idea中项目导出jar包
  7. 路易威登春夏23男装秀
  8. 永远不要再犯的 5 个编程错误
  9. 安装Windows 7和Linux(Ubuntu)双系统手记
  10. z时代,汽车品牌如何玩转年轻化营销?