Android官方开发教程中文版4(2)

2019-09-01 09:37

public void onPause() {

super.onPause(); //首先调用基类方法

// 释放照相机,因为暂停时我们不需要它 // 而其它Activity可能会使用它 if (mCamera != null) { mCamera.release() mCamera = null; } }

通常情况下,你不应该在onPause()方法中把用户的改变持久保存(比如登录到表单中的个人信息)。只有你确信用户希望这些改变会自动保存时(比如Email草稿),才在onPause()方法中把用户的改变持久储存。任何情况下,你都应该避免在onPause()中执行增加CPU负担的工作,比如写入数据库,因为这可能会使过渡到下一个Activity变得迟缓(你应该在onStop()的关闭操作中执行繁重的工作)。

如果你的Activity被停止了,你应该在onPause()方法中保持操作完成的数量,以允许快速过渡到用户的下一个目标。

注意:当Activity暂停时,Activity实例仍然驻留在内存中并在恢复时重新使用,你不需要重新初始化在Resume状态之前被回调方法创建的组件。

恢复Activity

当Activity从暂停状态中恢复时,系统会调用onResume()方法。

请注意,每当你的Activity进入前台,系统就会调用这个方法,包括它首次被创建时。这样一来,你应该实现onResume()方法来初始化在onPause()方法中释放的组件,以及执行其它在Activity每次进入Resume状态时必须发生的初始化工作(比如开始动画以及初始化仅在用户拥有焦点时用到的组件)。

下面onResume()的示例对应上面的onPause()示例,它初始化了在Activity暂停时释放的照相机。

@Override

public void onResume() {

super.onResume(); //首先调用基类方法

// 当Activity获得用户焦点时得到照相机的实例 if (mCamera == null) {

initializeCamera(); // 对照相机初始化的本地方法 } }

停止和重新启动Activity

在Activity生存周期内正确地停止和重启Activity是一个重要的步骤,它可以确保用户意识到App一直存活并且他们的进度没有丢失。以下几个关键场景中,Activity会停止和重启:

? 用户打开一个新的App窗口,以及从你的App切换到另一个App,你的App中当

前处于前台的Activity被停止。如果用户在“Home”屏幕中执行App图标或从新

App窗口中返回到你的App,Activity重新启动。

? 用户在你的App中执行某个操作启动一个新Activity,当第二个Activity被创建时,

当前Activity停止。如果用户按下“Back”按纽,第一个Activity重新启动。 ? 用户在手机上使用App时,接到电话。 Activity类提供了两个生命周期方法:onStop和onRestart(),它们允许你专门处理Activity的停止和重新启动。不像暂停状态只有部分UI被遮挡,停止状态确保UI不可见,并且用户的焦点处于不同的Activity(或完全不同的App)。

注意:因为Acctivity停止时,系统仍然会把它保留在内存中,你也许不需要在任何情况下都实现onStop(),onRestart()(或onStart())方法。对大部分Activity来说,简单地停止并重启就行了,你只需要在onPause()中暂停正在进行的操作以及断开和系统资源的连接。

当用户离开Activity时,系统调用onStop()停止Activity(1),如果用户从停止中返回,系统调用onRestart()(2),紧接着调用onStart()(3)和onResume()(4)。注意,不管什么情况导致Activity停止,系统都会在调用onStop()之前调用onPause()。

停止Activity

当Activity收到onStop()方法的调用时,它变得不可见并且释放几乎所有不再使用的资

源。Activity一旦停止,如果需要释放内存,系统可能会销毁它的实例。在极端情况下,系统可能简单地杀掉App的进程而不调用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实例仍然驻留在内存中并在恢复时重新使用,你不需要重新初始化在Resume状态之前被回调方法创建的组件。系统会对布局中的每个视图保持跟踪,如果用户在一个EditText部件中输入了文本,文本将会被保留,所以你不需要保存和恢复它。

注意:即使系统在Activity停止时把它销毁,视图对象(如EditText中的文本)的状态仍然保留在Bundle(键值对中的一个)中,并且在用户返回到Activity同一个实例时恢复它们(下一节讨论更多关于使用Bundle保存其它状态数据以防止Activity被销毁和重建的内容)。

启动/重新启动Activity

Activity从停止状态返回到前台时会调用onRestart()。每当Activity成为可见时,系统都会调用onStart()方法(whether being restarted or created for the first time),只有Activity从停止状态中恢复时才会调用onRestart()方法,如果Activity只是被停止而没有被销毁,你可能有必要在onRestart()方法中执行一些特殊的恢复工作。

App使用onRestart()恢复Activity状态的情况很少见,因此对这种应用方式没有任何指南。因为在onStop()方法中清除了Activity的所有资源,所以你需要在Activity重新启动时重新初始化它们。另外,Activity首次创建时,你也需要实例化这些资源(当它们在Activity实例中还不存在时)。基于此,你应该用onStart()方法来对应onStop()方法,因为系统在创建Activity和从停止状态中恢复Activity时都会调用onStart()方法。

例如,在返回App之前,用户可能已经离开很长时间了,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,当用户点击“OK”时,

// 用 android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS操作 // 打开设置屏幕,以便用户启用GPS。 }

}

@Override

protected void onRestart() {

super.onRestart(); //首先调用基类方法

// Activity从停止状态中恢复 }

重建Ativity

某些情况下,Activity被销毁是App的正常行为。比如用户按下“Back”按纽,或是Activity明确调用finish()方法来摧毁自己。如果Activity处于停止中,并且用户很长时间都没有使用它,或是前台Activity需要更多系统资源,系统不得不关闭后台进程以恢复内存,系统也可能会销毁Activity。

当Activity因为用户按下“Back”按纽或通过finish()方法结束自己时,由于这些行为表示Activity不再需要,系统会认为Activity实例永久消失。如果Activity被系统强制(相对于App的正常行为)销毁,虽然Activity实例已经消亡,但系统会“记得”它曾经存在,如果用户导航回来,系统会使用销毁时保存的数据和状态描述来创建新的Activity。系统用来恢复之前的状态(被称为“实例状态”)的这些数据保存在Bundle对象的键值对集合中。

警告:用户每次旋转屏幕时,Activity都会被销毁并重新创建。当屏幕方向改变时,系统销毁并重建前台Activity,因为屏幕设置发生变化,而且Activity可能要加载可替换资源(如布局)。

默认情况下,系统使用Bundle实例状态保存Activity中每个视图对象的信息(如EditText对象中的文本值)。所以当Activity被销毁和重建时,不需要通过代码来恢复布局状态。Activity可以有更多你想恢复的状态信息,比如一个跟踪用户进度的成员变量。

注意:要让Android系统恢复Activity中的视图状态,每个视图必须有一个唯一ID,由android:id属性提供。

要保存有关Activity状态的额外数据,你必须重写onSaveInstaneState()回调方法。当用户离开Activity时,系统调用这个方法并传递Bundle对象,在Activity被意外摧毁时保存Bundle对象。如果系统必须在稍后重建Activity实例,它会把相同的Bundle对象传递给onRestoreInstance()和onCreate()方法。

系统开始停止Activity时,它调用onSaveInstance()(1),你可以在这里指定Activity重建时需要恢

复的额外的状态数据。如果Activity被摧毁并要重建相同实例,系统会把(1)中定义的状态数据

传递给onCreate()(2)和onRestoreInstance()(3)方法。

保存Activity状态

当Activity开始停止时,系统调用onSaveInstance()方法,Activity可以使用键值对集合保存状态信息。这个方法的默认实现会保存Activity视图层次的状态信息,比如EditText的文本或ListView的滚动条位置。

要保存Activity的额外状态信息,你必须实现onSaveInstance()方法并向Bundle对象中添中键值对,例如:

static final String STATE_SCORE = \static final String STATE_LEVEL = \...

@Override

public void onSaveInstanceState(Bundle savedInstanceState) {

// 保存用户当前的游戏状态

savedInstanceState.putInt(STATE_SCORE, mCurrentScore); savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

// 总是调用基类方法,这样它可以保存视图层次状态 super.onSaveInstanceState(savedInstanceState); }

警告:永远要调用onSaveInstance()的基类实现,默认的实现会保存视图层次的状态。

恢复Activity状态

当Activity在销毁后重建时,你可以从系统传递给Activity的Bundle中恢复保存的状态。onCreate()和onRestoreInstance()方法都会收到相同的Bundle对象,它包含实例状态信息。

因为系统创建Activity的新实例或是重建之前的Activity都会调用onCreate()方法,所以你在尝试读取Bundle对象之前必须检查它是否为null。如果为null,系统在创建新的实例,否则就是恢复之前被摧毁的Activity。

下例是如何在onCreate()中恢复某些状态数据: @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 首先调用基类

// 检查是否在重建之前摧毁的实例 if (savedInstanceState != null) {

// 从保存的状态中恢复成员的值

mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else {

// 可能需要为新实例初始化成员的默认值 } ... }

你也可以选择实现onRestoreInstance()来替换onCreate()以恢复状态,系统会在onStart()

方法后调用它。系统仅在恢复保存的状态时才会调用onRestoreInstance()方法,所以你不需要检查Bundle对象是否为空。

public void onRestoreInstanceState(Bundle savedInstanceState) { // 总是调用基类方法,它能恢复视图层次

super.onRestoreInstanceState(savedInstanceState);

// 从保存的实例中恢复状态成员

mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }

警告:永远要调用onRestoreInstance()的基类实现,默认的实现会恢复视图层次的状态。

学习更多有关在运行时重新启动事件中重建Activity的内容(如屏幕旋转),请参考“处理运行时的改变”。


Android官方开发教程中文版4(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中华人民共和国国家职业卫生标准

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: