Android成长之路(4)——Activity的生命周期(2)

停止和重新启动Activity

适当地停止和重新启动Activity在生命周期里是非常重要的,这确保了用户回到app时感觉它一直都还在,并且不会丢失过程中的进度。

关于Activity被停止或者重新启动有以下几种情况:
1、用户从当前发app切换到另一个app,那么当前在前台的Activity就会被停止。如果用户从其他app回到你的app或者点击界面图标回到你的app,那么app中的Activity就会重新启动。
2、用户在当前的app中要切换到下一个Activity,那么当前的Activity就会被停止,下一个Activity会被创建。如果用户按下返回键,那么之前的那个Activity就会重新启动。
3、当用户正在用你的app是,接到来电,那么那么当前在前台的Activity也会被停止。听完电话返回到app,那么Activity会重新启动。

Activity类提供了两种方法,,onStop( ) 和 onRestart( ),这可以让我们在特定的时候处理Activity是被停止和重新启动。之前说过,不同于onPause()暂停的状态,这个阶段会有部分的UI还是可见的。但是一旦处于stopped状态,这个Activity的UI就是不可见的了,界面被另一个完全遮盖住。这就说明用户已在另一个Activity上交互了。

因为当它被停止的时候系统会在内存保留了你的Activity实例,所以可能不需要实现onStop() 和onRestart() ,甚至 onStart() 这些方法。大多数,可能只需要在onPause()方法中暂停正在运行的操作和断开获取系统资源的操作。

Android成长之路(4)——Activity的生命周期(2)_第1张图片

onStop

如图,可以清晰地知道整个过程。系统会调用onStop()来停止Activity,停留在Stopped这一阶段。当用户返回,系统就会调用onRestart(),紧跟着调用onStart()和onResume()。这时候,Activity就会重新回到Resumed这一阶段,也就是回到了前台,继续与用户进行交互。要注意的是,无论什么情况下导致Activity被停止,系统在调用onStop()之前总会先调用onPause()。

例如保存一个会议的草稿:

@Override
protected void onStop() {
    super.onStop();  // 总要先调用父类的函数

    // 保存当前的草稿,记录的东西不被丢失

    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update( mUri, values, null, null );
}

当调用onStop( )方法Activity被停止,这个Activity对象仍然被保留在内存中。调用onResume()重新恢复时,它会被重新调用。因此在任何一个生命周期的方法中,不需要重新初始化已经被创建过的组件。系统会跟踪layout中每一个View,如果用户在编辑栏中写了一些内容,这些内容会被保留。

尽管系统最后会销毁这个Activity,我们仍然可以把View类的对象(比如编辑栏的文本信息)放在一个Bundle(一个key~value对的容器)中,当在另一个Activity需要用到的时候,再把它取出来。

onRestart

当Activity从Stopped状态回到前台,就会调用onRestart()方法。Activity每一次变成可见的,系统也会调用onStart()方法,不管是重新启动还是第一次创建。onRestart()这个方法只会在之前是Stopped状态的时候调用,如果是Destroyed那就不行了。所以可以在里面执行一些可能需要的恢复操作。

因为onStop方法本质上要清除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"时,然后使用intent传入 
        // android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS来让用户设置GPS可用 
    }
}

@Override
protected void onRestart() {
    super.onRestart();  

}

当系统销毁Activity,会调用onDestroy()方法。因为在onStop()方法中已经释放了大部分的资源,所以大部分的app在Destroyed阶段没有什么太多可以做的了。这个方法是最后的机会清除掉那些可能会导致内存泄漏的资源,所以要保证其他的线程或者长时间运行的操作,例如应用方法跟踪也要被停止。

你可能感兴趣的:(android)