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


本课将会教你

  1. 停止你的Activity
  2. 启动/重启你的Activity

你应该还读了

尝试它

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

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn