现在的位置: 首页 > 综合 > 正文

Android培训—终止和重启Activity

2013年08月13日 ⁄ 综合 ⁄ 共 3357字 ⁄ 字号 评论关闭

正确的终止和重启你的Activity是Activity生命周期中重要的处理,它确保你的用户认为你的应用程序始终处于活动状态。在几个关键的场景中,你的Activity要被终止和重启:

1. 用户打开最近使用使用的应用程序窗口,并且从你的应用程序切换到另外一个应用程序。这时你的应用程序中那个当前在前台的Activity就会被终止。如果用户从主屏Launcher的图标或最近使用的应用程序窗口中返回到你的应用,那么该Activity就被重启。

2. 用户在你的应用程序中执行启动一个新的Activity的操作。这时当第二个Activity被创建时当前的Activity就会被终止。然后如果用户按下Back按钮,第一个Activity就会被重启。,

3. 当用户在使用你的应用程序时有电话呼入的时候。

Activity类提供了两个生命周期的方法:onStop()和onRestart(),这两个方法允许你在Activity被终止和重启时做一些特殊的处理。跟暂停状态不同,终止状态保证UI不再可见,并且用户的焦点也在另外的Activity中(或另外一个应用程序中)

注意:因为在Activity被终止时,系统会在内存中保留该Activity的实例,所以可以不实现onStop()和onRestart()(甚至是onStart())方法。对于大多数简单的Activity,只需要使用onPause()方法终止进行中的操作与系统资源的连接就可以了。

图1.当用户离开你的Activity时,系统会调用onStop()方法来终止Activity(1)。如果用被终止的Activity时,系统会调用onRestart()(2)方法,紧跟着会调用onStart()(3)和onResume()(4)方法。注意,不管Activity在什么情况下被终止,在调用onStop()方法之前,系统总会调用onPause()方法。

终止Activity

当你的Activity接收到对onStop()方法的调用时,它就不再可见了,并且应该释放所有不在需要的资源。一旦Activity被终止,如果系统需要回收内存,那么该Activity就有可能被销毁。极端的情况下,系统可能会简单的杀死你的进程而不调用Activity的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对象会驻留在内存中,并在恢复Activity时被重新调用。这时,你不需要重新初始化那些在Resumed状态期间创建的组件。系统还会保持布局中每个View的状态,因此如果用户在EditText控件中键入了文本,那么内容就会被保留,因而你不需要保存和恢复。

注意:即使销毁了被终止的Activity,它依然可以在Bundle对象中保存View对象的状态,并且在用户再次回到这个Activity中时恢复它们的状态。

启动/重启Activity

当Activity从被终止的状态中返回到前台,它就会接收到对onRestart()方法的调用。系统还还会调用onStart()方法,Activity每次变的可见时都会调用onStart()方法(不管是重启还是第一次被创建)。但是onRestart()方法只会在Activity从终止状态恢复Activity时才会被调用,因此你能够使用这个方法来执行一些必要的恢复工作,但被销毁的Activity不能被恢复。

应用程序很少使用onRestart()方法来恢复Activity的状态,因此几乎没有任何针对这个方法的指南。但是,因为onStop()方法会从根本上清理所有的Activity的资源,所以在Activity重启时你需要重新实例化它们,还有在Activity被首次创建时也需要实例化它们。由于这个原因,应该使用onStart()方法跟onStop()方法配对使用,因为系统会在创建和重启Activity时都会调用onStart()方法。

例如,因为用户在离开应用程序后很长时间才能够返回来,所以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()方法的调用时,就没有太多的事情要做。这个方法是释放内存的最后的机会,因此你应该确保那些额外的线程以及那些耗时的操作都应被终止和销毁。

抱歉!评论已关闭.