Android的生命周期(三)

来源:互联网 发布:打印出库单软件 编辑:程序博客网 时间:2024/06/06 09:19

停止和重启activity

翻译自官方文档API 21

  合适地停止和重启你的activity是activity生命周期中一个重要的进程,它会确保让用户觉得你的APP一直在运行而且还没有丢掉他们的进度。在以下几个重要的场景中你应当停止和重启你的activity:

  • 用户打开了最近使用的应用窗口并从你的APP切换到其他的APP。你的APP中当前在前台的activity被停止了。如果用户从home界面的启动图标或者是近期使用的应用窗口回到你的activity,这个activity就会重启;
  • 用户在你的APP中启动了一个活动,从而启动了一个新的activity。如果用户按了返回按钮,第一个activity重启;
  • 当正在使用你的APP时,用户接到了一个电话。

  Activity类提供了两个生命周期函数,onStop()和onRestart(),这允许你具体地处理你的activity如何应对停止和重启。不像暂停状态确定UI只是被部分遮挡,停止状态确保这个UI很快就不可见,用户的焦点在另外一个activity中(或者是另外一个APP中)。

Note:因为在停止状态时,你的activity实例仍然保留在系统内存中,很有可能你不必去实现onStop()和onStart()方法(甚至完全不用去实现onStart()方法)。对于大多数相对简单的activity,它会很好地停止和重启activity,你仅需要使用onPause()方法去停止一些正在进行的活动并断开他们与系统资源的连接。


图1
图1 当用户离开你的activity时,系统调用onStop()方法停止这个activity(1)。如果在停止时用户回到了这个activity,系统调用onRestart()方法(2),然后马上调用onStart()方法(3)和onResume()方法(4)。注意到,无论是任何场景造成了这个activity停止了,系统都会在调用onStop()方法之前调用onPause()方法。

停止你的activity

  当你的activity被调用onStop()方法时,它即将对用户不可见,并且应该释放掉一切用户不再使用而且不再必须的系统资源。一旦你的activity停止了,如果系统需要释放内存时,你的activity实例极有可能被销毁。在极端的情况下,系统可能在未调用最后的onDestory()方法就杀死你的APP进程,所以,使用onStop()方法来释放可能造成内存泄露的资源是十分重要的。

  尽管onPause()方法在onStop()方法之前被执行,但是你应当使用onStop()方法来做一些大型的,CPU密集型的关闭操作,比如向数据库写入信息。

  举个例子,这里实现了onStop()方法,把一个草稿的内容存到持久存储介质上。

@Overrideprotected 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对象仍然被保留在内存中,当activity恢复时,它又会被重新调用。你不必重新初始化那些在恢复状态之前被创建的组件。系统也会追踪当前状态布局文件中的每一个视图(View),所以说,如果用户在EditText组件中输入了文字,这些内容已经被保存,所以你不用再去保存它。

Note: 即便是系统在你的activity停止时将它销毁了,它仍然在Bundle对象(一些键值对)中保留了View对象(比如Edittext对象中的文本)的状态。

启动/重启你的activity

  当你的activity从停止状态回到前台的时候,它被调用onRestart()方法。系统同样也会调用onStart()方法,这是每次你的activity变得可见时都会发生的(不管是activity重新启动或是第一次被创建)。然而,onRestart()方法却只有在activity从停止状态恢复时才会被调用,所以你可以用这个方法来做一些特殊的恢复工作,这些工作有可能仅在activity之前被停止但没有被销毁是是必要的。

  一个APP使用onSttart()方法来恢复activity的状态是不常见的,所以这里并没有这个方法应用于一般APP的指南。然而,因为你的onStop()方法应当释放你的activity的所有资源,所以你必须在activity重启时重新分配这些资源。但是,你也必须在activity第一次被创建时分配这些资源(当这个activity实例不存在时)。因此,你应该通常使用onStart()方法来对于onStop()方法,因为系统在你第一次创建activity和从停止状态恢复时,都会调用onStart()方法。

  举例来说,因为用户可能会在离开你的APP很久后才回来,所以onStart()方法是验证系统所需的功能是否启用的好地方:

@Overrideprotected 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"    }}@Overrideprotected void onRestart() {    super.onRestart();  // Always call the superclass method first    // Activity being restarted from stopped state    }

  当系统销毁你的activity时,它会为你的activity调用onDestory()方法。因为你已经在onStop()方法中释放了大多数系统资源,所以等到系统再调用onDestory()方法时,大多数APP已经没有太多的资源要释放。这个方法是你释放可能导致内存泄漏的资源的最后机会,所以,你应当确保一些额外的线程已经被销毁,并且其他的一些像方法追踪(method tracing)这样的长期的动作也已经被停止。

0 0
原创粉丝点击