Android API 中文 (3) —— 停止和重启一个Activity

在正常的应用程序使用时,前台活动有时通过使所述活动暂停等可视部件阻塞。例如,当一个半透明活性打开(诸如一个在一个对话的方式),在以前的活动暂停。只要活动仍部分可见,但当前未处于焦点中的活动,它保持暂停。

然而,一旦活性完全阻塞和不可见的,它停止(这将在下一课讨论)。

当你的活动进入暂停状态时,系统调用的onPause()方法的活动,它允许你停止不应该继续暂停时(如视频)正在进行的动作或持续存在,应永久保存,以防任何信息用户继续留下您的应用程序。如果用户返回到从暂停状态的活动,系统恢复,并调用onResume()方法。

注意:当你的活动接听电话时,onPause()它可能是一个迹象,该活动将被暂停了一会儿,用户可以将焦点返回到你的活动。然而,这通常是第一个迹象表明,用户正在离开你的活动。



图1.当用户离开你的活动时,系统调用的onStop()停止活动(1)。如果在活动停止用户返回,系统调用onRestart()(2),紧接着ONSTART()(3)和onResume()(4)。请注意,无论什么情况下会导致活动停止,系统()之前调用的onStop总是调用的onPause()。

停止你的活动
当你的活动收到一个调用的onStop()方法,它不再是可见的,应该释放那些在用户不使用它并不需要的几乎所有资源。一旦你的活动停止后,系统可能会破坏。例如,如果需要恢复系统内存。在极端情况下,该系统可能只是杀了你的应用程序,而无需调用该活动的最后的onDestroy()回调,让你用的onStop()释放可能泄漏内存资源,这一点很重要。

虽然在onPause()方法在onStop()调用之前,你应该使用的onStop()来执行更大,更多的CPU关机操作,如将信息写入数据库。

例如,这里的的onStop()的实现,节省了一张字条给永久存储草案的内容:

@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

   //保存注释的目前的草案,因为该活动是停止
    //我们要确保当前音符的进展不会丢失。
    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.
            );
}
当你的活动都已停止,活动对象保持驻留在内存中的活动恢复时回忆说。不需要重新初始化过程中的任何的回调方法导致对续状态中创建的组件。该系统还跟踪在布局中的每个视图的当前状态,因此如果用户输入的文字变成一个EditText小部件,这些内容被保留,所以你不需要保存和恢复它。

注:即使系统破坏你的活动,而它停了下来,它仍保留在一个Bundle(键值对的BLOB)查看对象(如一个EditText文本)的状态,并恢复他们,如果用户返回该活动的同一个实例(下一课更多地谈论用包保存,以防您的活动被破坏并重新创建其他状态数据)。


启动/重新启动您的活动
当你的活动回来,从停止状态的前景,它接收调用onRestart()。该系统还调用的OnStart()方法,这恰好每次你的活动变得可见的时间(无论是正在重新启动或首次创建)。该onRestart()方法,但是,被称为从停止状态下的活动恢复,只有当,所以你可以用它来执行只有在以前的活动停止,但不被破坏,可能需要特殊的修复工作。

这是罕见的一个应用程序需要使用onRestart()来恢复活动的状态,所以不会有这种方法适用于应用程序的一般人群的指引。但是,因为你的onStop()方法应该基本上清理所有活动的资源,你需要重新实例化它们的活动重新启动时。然而,你还需要在你的活动是第一次创建实例化它们(当有活动的任何现有实例)。出于这个原因,你通常应该使用ONSTART()回调方法作为对应到的onStop()方法,因为系统调用ONSTART()既当它创建你的活动,并在重新启动时从停止状态的活动。

例如,因为用户可能已经离开你的应用程序很长一段时间回来之前,该ONSTART()方法是一个好地方,以验证功能被启用所需的系统:

@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first
    
   //活动要么被重新启动或启动的第一次
    //所以这是我们应该确保GPS已启用
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) {
            //创建这里一个对话框,请求用户启用GPS,并使用意图
        //与android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS行动
        //把用户设置窗口启用GPS时,单击“确定”
    }
}

@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first
    
    // Activity being restarted from stopped state    
}
当系统破坏活动,它调用onDestroy()方法,为您的活动。因为你通常应该已经发布了大部分的资源与onStop()的时候,你接到一个电话来onDestroy(),没有太多的大多数应用程序需要做的。这种方法是你最后一次机会来清理资源,可能会导致内存泄漏,所以你应该确保其他线程被破坏和其他长期运行的操作,如方法跟踪也停止。

你可能感兴趣的:(android,停止和重启activity)