正确地停止和重新启动你的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的更多相关文章

  1. android 学习随笔十四(页面跳转与数据传递)

    1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...

  2. 零基础Android学习笔记-02 安卓程序生命周期

    一个安卓程序生命周期会经历7中状态,并不一定是每次都全部经历.Create,Start,ReStart,Pause,Resume,Stop,Destory. 重载方法,用helloWorld程序去体验 ...

  3. maven学习(十)——maven生命周期以及插件

    一.生命周期 1.何为生命周期? Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤 2.Maven三大生命周期 Maven有三套 ...

  4. Android学习(十四) Service组件

    一.定义 运行在后台,没有页面,不可见.优先级高于Activity,当系统内存不足时,会先释放一些Activity.注意,Service同样是运行在主线程中,不能做一些耗时操作.如果一定要做一些耗时的 ...

  5. android学习笔记28——Activity生命周期

    Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...

  6. Android编程: Activity生命周期和LogCat使用

    学习内容:Activity生命周期和LogCat使用 ====Activity生命周期==== 图示(转载): 创建    onCreate重启    onRestart开始    onStart恢复 ...

  7. 浅谈Android之Activity生命周期

     Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...

  8. Android Activity生命周期的几个问题

      每一个Android开发者都应该知道,android系统有四个重要的基本组件,即Activity(活动).Service(服务).Broadcast Receive(广播接收器)和Content ...

  9. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

随机推荐

  1. DataTable转成Json

    /// <summary>         /// DataTable转成Json /// </summary>         /// <param name=&quo ...

  2. linux添加开机启动项的方法介绍

    使用chkconfig命令可以查看在不同启动级别下课自动启动的服务(或是程序),命令格式如下:chkconfig --list可能输出如下:openvpn 0:关闭 1:开启 ...... 6:关闭 ...

  3. Python(三) 变量与运算符

    一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1,   a='1',   a=(1,2),  ...

  4. Linux桌面词典 星际译王(StarDict)

    星际译王(StarDict)是利用GTK(GIMP TOOLKIT)开发的国际化的.跨平台的自由的桌面字典软件.它并不包含字典档,使用者须自行下载配合使用.它可以运行于多种不同的平台,如Linux, ...

  5. vue抽取公共方法———方法一

    方法一:Vue插件 1.概述 作用:满足vue之外的需求,特定场景的需求 比如说,让你在每个单页面组件里,都可以调用某个方法(公共方法),或者共享某个变量等 2.使用方法 [声明插件]- [写插件]- ...

  6. Zabbix监控平台部署

    系统环境 Server端:192.168.149.128 Agent端:192.168.149.129 一.lamp环境安装 1.yum安装lamp yum install -y http http- ...

  7. vue踩坑- 报错npm ERR! cb() never called!

    在vue项目中引入饿了么elementUI组件的步骤之中,出现以下的错误: D:\my-project-first>npm i element-ui -S Unhandled rejection ...

  8. @Mapper 和 @MapperScan 区别

    1.@Mapper : 为了使接口被其他类引用,需要使用@Mapper注解,这种方式要求每一个mapper类都需要添加此注解,麻烦. package com.example.demo.dao; imp ...

  9. UVA - 10032 Tug of War (二进制标记+01背包)

    Description Problem F: Tug of War A tug of war is to be arranged at the local office picnic. For the ...

  10. 机房收费系统——UML类图

    在对一个软件系统进行设计和建模的时候,一般是从构造系统的基本词汇開始,包含构造这些词汇的基本属性和行为. 系统分析师假设要对所设计的系统清晰认识.还有考虑这些基本词汇之间的关系.而假设把这些行为可视化 ...