3.3 停止和重启 Activity

正确停止和重启 Activity 是 Activity 生命周期中的重要过程,其可确保您的用户知晓应用始终保持活跃状态并且不会丢失进度。Activity 停止和重启的场景主要有以下几种:

  • 用户打开“最近应用”窗口并从您的应用切换到另一个应用。您的应用中当前位于前台的 Activity 将停止。 如果用户从主屏幕启动器图标或“最近应用”窗口返回到您的应用,将会重启 Activity。
  • 用户在您的应用中执行开始新 Activity 的操作。当第二个 Activity 创建好后,当前 Activity 便停止。 如果用户之后按了返回按钮,第一个 Activity 会重新开始。
  • 用户在其手机上使用您的应用的同时接听来电。

Activity 类提供两种生命周期方法: onStop()onRestart(),这些方法允许您专门处理 Activity 句柄停止和重新启动的方式。 不同于识别部分 UI 阻挡的暂停状态,停止状态保证 UI 不再可见,且用户的焦点在另外的 Activity(或完全独立的应用)中。

:因为系统在 Activity 停止时会将您的 Activity 实例保留在系统内存中,您根本无需实现 onStop()onRestart() 或甚至onStart() 方法。对于大多数相对简单的 Activity 而言,Activity 将停止并重新启动,并且您可能只需使用 onPause() 暂停正在进行的操作,并从系统资源断开连接。

图 1. 用户离开 Activity 时,系统会调用 onStop() 停止 Activity (1)。如果用户在 Activity 停止时返回,系统会调用 onRestart() (2),紧接着调用 onStart() (3) 和 onResume() (4)。请注意,无论什么场景导致 Activity 停止,系统始终会在调用 onStop() 之前调用 onPause()

停止 Activity

当您的 Activity 收到 onStop() 方法的调用时,它不再可见,并且应释放几乎所有用户不使用时不需要的资源。 一旦您的 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 继续时被再次调用。 您无需重新初始化在任何导致进入“继续”状态的回调方法过程中创建的组件。 系统还会在布局中跟踪每个 View 的当前状态,如果用户在 EditText 小部件中输入文本,该内容会保留,因此您无需保存即可恢复它。

:即使系统在 Activity 停止时销毁了 Activity,它仍会保留 Bundle(键值对的二进制大对象)中的 View 对象(比如 EditText 中的文本),并在用户导航回 Activity 的相同实例时恢复它们(下一堂课讲述更多有关在您的 Activity 被销毁且重新创建的情况下使用 Bundle 保存其他数据状态的知识)。

启动/重启 Activity

当您的 Activity 从停止状态返回前台时,它会接收对 onRestart() 的调用。系统还会在每次您的 Activity 变为可见时调用 onStart() 方法(无论是正重新开始还是初次创建)。但是,只会在 Activity 从停止状态继续时调用 onRestart() 方法,因此您可以使用它执行只有在 Activity 之前停止但未销毁的情况下可能必须执行的特殊恢复工作。

应用需要使用 onRestart() 恢复 Activity 状态的情况并不常见,因此没有适用于一般应用群体的任何方法指导原则。 但是,因为您的 onStop() 方法应基本清理所有 Activity 的资源,您将需要在 Activity 重新开始时重新实例化它们。 但是,您还需要在您的 Activity 初次创建时重新实例化它们(没有 Activity 的现有实例)。 出于此原因,您应经常使用 onStart() 回调方法作为 onStop() 方法的对应部分,因为系统会在它创建您的 Activity 以及从停止状态重新启动 Activity 时调用 onStart()

例如,因为用户可能在回到它之前已离开应用很长时间,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 时,它会调用您的 ActivityonDestroy() 方法。因为您通常应已使用 onStop() 释放大多数您的资源,到您接收对 onDestroy() 的调用时,大多数应用无需做太多操作。此方法是您清理可导致内存泄露的资源的最后一种方法,因此您应确保其他线程被销毁且其他长期运行的操作(比如方法跟踪)也会停止。

时间: 2024-10-25 07:04:03

3.3 停止和重启 Activity的相关文章

1.4.3 停止与重启Activity

恰当的停止与重启我们的activity是很重要的,在activity生命周期中,他们能确保用户感知到程序的存在并不会丢失他们的进度.在下面一些关键的场景中会涉及到停止与重启: 用户打开最近使用app的菜单并从我们的app切换到另外一个app,这个时候我们的app是被停止的.如果用户通过手机主界面的启动程序图标或者最近使用程序的窗口回到我们的app,那么我们的activity会重启. 用户在我们的app里面执行启动一个新activity的操作,当前activity会在第二个activity被创建后

8) 十分钟学会android--Activity的生命周期之停止与重启

恰当的停止与重启我们的activity是很重要的,在activity生命周期中,他们能确保用户感知到程序的存在并不会丢失他们的进度.在下面一些关键的场景中会涉及到停止与重启: 用户打开最近使用app的菜单并从我们的app切换到另外一个app,这个时候我们的app是被停止的.如果用户通过手机主界面的启动程序图标或者最近使用程序的窗口回到我们的app,那么我们的activity会重启. 用户在我们的app里面执行启动一个新activity的操作,当前activity会在第二个activity被创建后

Android学习路线(十四)Activity生命周期——停止和重启(Stopping and Restarting)一个Activity

先占个位置,下次翻译~ :p Properly stopping and restarting your activity is an important process in the activity lifecycle that ensures your users perceive that your app is always alive and doesn't lose their progress. There are a few of key scenarios in which

shell脚本批量/单独启动、停止、重启java独立jar程序

本人最近半年使用阿里dubbo做开发,并在公司内部大力进行推广,将原来一个笨重且不易于维护的大项目切分成多个相对独立的java程序,好处是显而易见的,但是随着切分的独立运行程序包越来越多,程序的部署变成了一件非常头痛的问题,无耐之下,本人想到可否写一个shell脚本来批量/单独启动.停止.重启这些独立的java程序,之前没有写过shell脚本,研究二天后,终于将这个脚本写出来了,以后部署起来方便多了,废话不多说,直接贴上shell脚本,有需要的朋友可以根据自己项目修改前面的程序代码数组.程序名称

linux 下 apache启动、停止、重启命令

原文:linux 下 apache启动.停止.重启命令 基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/usr/local/apache2/bin/apachectl start apaceh启动 apache停止命令 /usr/local/apache2/bin/apachectl stop   停止 apache重新启动命令: /usr/local/apache2/bin/apachectl res

nginx启动,停止,重启

Nginx的启动.停止与重启 启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [[email protected] sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 停止 nginx的停止有三种方式: 从容停止 1.查看进程号 [[email protected] ~]# ps -ef|grep nginx 2.杀死进程 [[email protected] ~]# ki

Linux上服务的启动,停止和重启

(1)查看所有的服务 [[email protected]:practice] service Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ] [[email protected]:practice] service --status-all [ + ] acpid [ - ] anacron [ - ] apparmor [ ? ] apport [ + ] av

Ubuntu启动、停止、重启MySQL,查看MySQL错误日志、中文编码错误

1)启动: sudo /etc/init.d/mysql start 2)停止: sudo /etc/init.d/mysql stop 3)重启: sudo /etc/init.d/mysql restart 4)查看日志: cat /var/log/mysql.err cat /var/log/mysql/error.log 5)不支持中文 修改 /etc/mysql/my.cnf 在 [client] 下面增加: default-character-set=utf8 或 character

pg_ctl -- 启动、停止、重启 PostgreSQL

pg_ctl 名称 pg_ctl -- 启动.停止.重启 PostgreSQL 语法 pg_ctl start [-w] [-s] [-D datadir] [-l filename] [-o options] [-p path]pg_ctl stop [-W] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]pg_ctl restart [-w] [-s] [-D datadir] [-m s[mart] | f[ast] | i[m