您的位置:首页 > 移动开发 > Android开发

Android开发第2-3课:停止和重启一个Activity

2013-05-16 11:48 323 查看

本课将会教你

停止你的Activity
启动/重启你的Activity

你应该还读了

Activities

尝试它

Download the demo
ActivityLifecycle.zip

适当的停止和重启你的activity是activity生命周期中一个非常重要的过程,它可以确保你的用户意识到你的app总是活的并且没有丢失进度。有一些情景中,你的activity需要停止和重启:

用户打开最近的 Apps窗口并且跳转到你其他的app。 你的app中的前景activity已经停止。如果用户从主屏图标或者最近app窗口返回你的,然后activity重启。
用户在你的app中执行一个动作来启动一个新的activity。 当创建一个activity时当前的activity已经停止。 如果用户按返回键,第一个activity被重启。
在用户使你的app的时候,用户接到一个电话。

Activity
类提供了两个生命周期函数,
onStop()
onRestart(),
它们可以使得你特别地控制你的activity句柄何时停止,何时重启。和 标示部分UI被掩盖的UI的paused状态不同,停止状态保证了 UI不再可见并且用户的焦点已经在一个分离的activity (或者一个完全分离的app)中。

注意: 由于停止的时候系统内存中保留了你的Activity实例,所以你有可能不需要实现
onStop()
onRestart()
(甚至
onStart()
。大多数的activity都是比较简单的,activity会停止并且重启的很好,你只需使用
onPause()
来停止运行中的动作并且他们从系统资源中断开。







Figure 1. 等用户离开你的activity,系统调用
onStop()
来停止activity 。 如果在activity停止的时候,用户返回了,系统调用
onRestart()
(2),然后快速调用
onStart()
(3) 和
onResume()
(4)。 要注意的是无论什么场景导致activity停止了,系统总会在调用onStop()前调用
onPause()。

停止你的Activity

当你的activity接到
onStop()
的调用,它将不在可视并且应该释放所有用户没有用到的资源。一旦你的activity停止了,如果需要恢复系统内存,系统会毁掉这个实例。在极端的情况下,系统会直接杀死你的app进程而不会调用
onDestroy(),所以使用o
nStop()
来释放会导致内存泄露的资源。尽管
onPause()
前会先调用
onStop(),你应该使用o
nStop()
来执行大的,需要更多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
对象会被保留内存中,到恢复的时候再次调用。 你不需要重新初始化在回调函数中创建的达到Resumed状态的组件。 系统会继续跟踪布局中的每个View的状态,所以如果用户向
EditText
窗体中输入文本,这些内容将会被保留,所以你不必保存并且恢复它。

注意: 就算系统在activity停止的时候销毁了你的activity,它仍然在
Bundle (一个blob的主值对) 中
保留View对象的状态 (例如
EditText中的文本
),如果用户回到之前的实例系统会回复它(下一节课将会介绍更多有关
Bundle在保存状数据中的应用)。

启动/重启你的Activity

当你的activity从停止状态中回到前台时,它将会接受到onRestart的调用。每次你的activity变得可视时(无论是重启还是第一次创建),系统也会调用
onStart()
函数。然而,
onRestart()
函数只会在stopped状态中恢复的时候调用一次,所以你可以使用它来执行特定的恢复工作,这只是在activity在之前被停止了,但是还有销毁的时候有需要。

onRestart()
来恢复activity的状态是不正常的,所以这个函数没有任何应用到这个app的向导。然而,因为你的
onStop()
函数应该必要地清除你的所有activity的资源,在重启的时候你需要重新初始化它。 然而,当你的activity第一次创建的时候,你还需要实例化它 (当已经没有这个activity的实例的时候)。 由于这个原因,你应该使用
onStart()
来作为
onStop()
的反向对应函数,应为不管是第一次创建你的activity‘还是由stopped状态重启你的activity,系统都会调用s
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()的调用的时候,
apps已经没有太多东西要做了。 这个函数是你清理可能导致内存泄露的资源的最后机会,所以你应该确保其他的线程和长期运行的动作也已经停止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: