Android学习路线(十四)Activity生命周期——停止和重新启动(Stopping and Restarting)一个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() 方法来停止你的(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()时就没有太多的东西须要做。这种方法是清理可能导致内存泄漏的最后的方法,因此你须要确保那些附加线程以及其它的长时间操作(像方法跟踪)都被停止。


posted on 2017-06-10 21:49  yjbjingcha  阅读(425)  评论(0编辑  收藏  举报

导航