安卓训练-开始-管理 Activity 生命周期-停止和重启 Activity

停止和重启 Activity

这节课教你
  1. 停止你的 Activity
  2. 启动/重启你的 Activity
你还需要阅读
试试
下载示例

ActivityLifecycle.zip

正确地停止和重启你的 activity 是 activity 的生命周期中的一个重要过程,确保你的用户感觉到你的应用还在活动并且不丢失他们的进度。有一些你的 activity 停止和重启的关键场景:

  • 用户打开最近的应用窗口,并从你的应用切换到其他应用。当前在前台的你的应用的 activity 就停止了。如果用户从主屏幕的启动图标或最近的应用窗口回到你的应用,那个 activity 重新启动。
  • 用户在你的应用中执行一个启动新的 activity 的操作,当第二个 activity 创建时,当前的 activity 被停止。如果之后用户按后退按钮,第一个 activity 重新启动。
  • 用户在他或她的手机上用你的应用时接到了一个电话。

Activity 类提供了两个生命周期方法,onStop()onRestart(),它们允许你指定当你的 activity 停止或重启时怎样处理。和确定部分 UI 阻塞的暂停状态不同,停止状态确保 UI 不再可见并且用户焦点在另一个 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 停止,如果系统需要恢复系统内存,它可能销毁这个实例。在极端的情况下,系统可能简单地杀死你的应用进程而不调用的 activity 的最终的 onDestroy() 回调方法,所以你使用onStop() 释放可能导致内存泄露的资源就很重要。

尽管 onPause() 方法在onStop() 之前调用,你应该使用onStop() 执行大规模的 CPU 密集型的关闭操作,比如写信息到数据库。

例如,这里是一个保存笔记草稿到持久化存储的 onStop() 方法的实现:

@Override
protected void onStop() {
    super.onStop();  // 总是先调用超类方法

    // 保存笔记的当前草稿,因为这个 activity 正被停止
    // 并且我们不想丢失当前的笔记进度。
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // 需要更新的笔记的 URI。
            values,  // 列名和它们的新值的映射。
            null,    // 没有使用 SELECT 条件。
            null     // 没有使用 WHERE 列。
            );
}

当你的 activity 被停止,Activity 对象仍保留在内存中并在 activity 恢复时被唤醒。你不需要重新初始化那些在 Resumed 状态之前的回调方法中创建的组件。系统还记录了布局中的每个View 的当前状态,所以如果用户在一个EditText 控件中输入了文本,内容会被保留,你不需要保存并恢复它。

注意:甚至当你的 activity 停止后,系统销毁了它,系统仍在一个 Bundle 中(一团键值对)保留了View 对象的状态(比如一个EditText 中的文本)并且在用户导航回到这个 activity 的同一个实例时恢复它们(下一课 讨论更多关于使用一个 Bundle 其他状态数据以免你的 activity 销毁和重建)。

启动/重启你的 Activity


当你的 activity 从停止状态回到前台,它接收一个 onRestart() 调用。每当你的 activity 变为可见时(不管是第一次创建还是重启),系统还调用onStart() 方法。但是,只有当 activity 从停止状态恢复时才调用onRestart() 方法,所以你可以使用它执行一些只有当 activity 先前被停止而不是销毁时才可能必须的特殊的恢复工作。

你的应用需要用 onRestart() 恢复 activity 的状态的情况并不常见,所以没有在一般的应用中使用这个方法的指导原则。但是,因为你的onStop() 方法应该在根本上清除你的 activity 的所有资源,在 activity 重启时你需要重新初始化它们。当你的 activity 第一次创建时(当还不存在这个 activity 的实例时),你也需要初始化它们。由于这个原因,你通常应该使用onStart() 作为与onStop() 方法相对应的方法,因为当系统创建你的 activity 或从停止状态重启它时会调用onStart()

例如,因为用户在回到你的应用前可能已经离开了很长时间,onStart() 方法是检查所需的系统特性是否启用的好地方:

@Override
protected void onStart() {
    super.onStart();  // 总是先调用超类方法
    
    // 这个 activity 可能第一次启动,也可能重启
    // 所以在这里确保启用了 GPS
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) {
        // 在这里创建一个对话框,请求用户启用 GPS,并使用一个
        // 带 the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS 动作的 intent
        // 让用户转到设置屏幕,在他们点击 "OK" 后启用 GPS 
    }
}

@Override
protected void onRestart() {
    super.onRestart();  // 总是先调用超类方法
    
    // Activity 从停止状态重启
}

当系统销毁你的 activity 时,它调用你的 ActivityonDestroy() 方法。因为你通常应该已经在onStop() 中释放了大部分资源, 在你收到onDestroy() 调用的时候,大部分应用都不需要做许多事情。这个方法是你清理可能导致内存泄露的资源的最后机会,所以你需要确保销毁另外的线程并且停止其他长时间运行的操作,比如跟踪方法。

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值