停止和重新启动一个Activity(翻译)

停止和重新启动一个Activity

合适的停止和重新启动你的Activity是你的Activity生命周期中的重要的过程,从而使得你的用户感觉你的app是一直活着的,并且不会丢失他们的进度。有一些关键的场景,你的Activity会被停止和重新启动。

  • 用户打开最近使用app的窗口,并且从你的app切换到另一个app。你的app中当前正在前台运行的Activity会被停止,如果用户从主屏幕登陆图标或最近使用app窗口返回你的app,Activity被重新启动。
  • 用户在你的app中执行一个动作启动一个新的Activity。当第二个Activity被创建的时候当前的Activity被停止。如果用户之后按返回按钮,第一个Activity被重新启动。
  • 当在电话上使用你的app时用户接到一个电话。

Activity类提供两个生命周期方法,onStop()和onRestart(),这允许你明确你的Activity如何处理被停止和被重新启动。不像暂停状态,暂停状态是明确部分UI被遮掩,停止状态保证UI不再可见并且用户的关注点在别的Activity上(或者完全是另一个app)。

注意:因为当Activity停止时系统在系统内存中保持你的Activity实例,可能你完全不需要实现onStop()和onRestart()(或者甚至是onStat()方法)方法。对于大多数相对简单的Activity来说,Activity能很好的停止和重新启动,并且你也许只需要使用onPause()方法来暂停正在执行的动作和从系统资源断开。

停止和重新启动一个Activity(翻译) 停止你的Activity

当你的Activity收到一个onStop()方法的调用时,它将不再可见并且应该释放几乎所有当用户不使用它时不需要的资源。一旦你的Activity被停止了,系统可能会销毁这个实例当它需要释放系统内存时。在极端的情况下,系统可能简单的杀掉你的app进程,而不调用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状态之前所调用的回调方法中创建的组件。系统也会保持当前布局中各个视图View的当前状态的跟踪,因此如果用户在EditText组件中输入文本,内容会被保存,因此你不需要去保存和恢复它。

注意:即使当处于Stopped状态时系统销毁了你的Activity,系统仍然在一个Bundle(一个保存键值对的二进制文件)中保存着视图对象的状态(比如文本框中的文本),并且在用户导航回同样的Activity实例时恢复它们(下一课将讨论更多关于在你的Activity被销毁和重新创建时使用一个Bundle来保存其他状态数据的内容)。

启动和重新启动你的Activity

当你的Activity从Stopped状态回到前台运行,它会被调用onRestart()方法。系统也会调用onStart()方法,这会发生在每次你的Activity变得可见时(不管是被重新启动还是被首次创建)。然而,onRestart()方法只在Activity从Stopped状态被重新启动时才会被调用,因此你可以使用它来执行一些特殊的恢复工作,这些工作可能只在Activity原来只是被停止,而没有被销毁时才是需要的。

一个app需要使用onRestart方法来恢复Activity状态是不常见的,因此没有任何关于这个方法的指南适用于普通的app。然而,因为你的onStop()方法本应该清除你的Activity所有的资源,在Activity重新启动时你会需要重新初始化它们。然而,当你的Activity在首次创建时(当还不存在Activity的实例时)你也需要初始化它们。因为这个原因,你应该使用onStart()回调方法作为onStop()方法的配对,因为系统在当它第一次创建你的Activity时和当它从Stopped状态重新启动你的Activity时都会调用onStart()方法。

举个例子,因为用户在回来之前可能已经长时间的离开你的app,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,它会为你的Activity调用onDestroy()方法。因为你通常应该在onStop()方法中释放你的大多数资源,当你收到onDestroy方法时,大多数app都不需要做什么。这个方法是你的最后机会来清除资源,从而避免资源泄露,因此你应该确保那些额外的线程已经被销毁了,并且其他长时间的动作比如方法跟踪也被停止了。

相关推荐