正确地停止和重新启动你的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. 存储过程和transaction

    https://stackoverflow.com/questions/11531352/how-to-rollback-a-transaction-in-a-stored-procedure BEG ...

  2. Lesson 2 Building your first web page: Part 3

    Time to build your first HTML page by hand I could go on with more theory and send half of you to sl ...

  3. Material Design控件使用学习 TabLayout+SwipeRefreshlayout

    效果: Tablayout有点类似之前接触过的开源ViewPagerIndicator,将其与viewpager绑定,可实现viewpager的导航功能. SwipeRefreshLayout是官方出 ...

  4. php 扩展

    如何利用PHP扩展函数,扩展出自己的函数等 php扩展函数有哪些zend_parse_parameters() spprintf() RETURN_STRINGL()

  5. POJ - 3846 Mountain Road 动归

    POJ - 3846 Mountain Road 题意:n个人要过桥,有的人从左边来,有的人从右边来,给你他们到达桥一端的时间和过桥所需要的时间,要求相向而行的只能有一人,对于每一个点,不能在10s内 ...

  6. vue.js中compted与model的区别

    在p便签内写的{{reversemessage}}方法,若js里对应的函数为computed则不需要加上括号 若js里对应的函数为model则应该将{{reversemessage}}改为{{reve ...

  7. 超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集

    原文:超好用的谷歌浏览器.Sublime Text.Phpstorm.油猴插件合集 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.c ...

  8. web开发快速提高工作效率的一些资源

    前端学习资源实在是又多又广,在这样的一个知识的海洋里,我们像一块海绵一样吸收,想要快速提高效率,平时的总结不可缺少,以下总结了一些,排版自我感觉良好,推送出来,后续持续跟新中...... 开发工具 H ...

  9. 安卓https

    http://www.tuicool.com/articles/NrmE3e http://blog.csdn.net/guestcode/article/details/50194357 http: ...

  10. JavaWeb-04(BOM&amp;DOM)

    JavaWeb-04 JavaWeb-BOM&DOM BOM 一.知识回想 * BOM 概述 * BOM 的各个对象 * window对象 innerHeight,innerWidth doc ...