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

本课将会教你

  1. 停止你的Activity
  2. 启动/重启你的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(),所以使用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对象会被保留内存中,到恢复的时候再次调用。 你不需要重新初始化在回调函数中创建的达到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,系统都会调用sonStart()。 

例如,由于用户在回到你的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已经没有太多东西要做了。 这个函数是你清理可能导致内存泄露的资源的最后机会,所以你应该确保其他的线程和长期运行的动作也已经停止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值