正确地停止和重新启动你的activity在activity的生命周期中是一个非常重要的过程。这样可以确保你的用户感觉到你的应用一直都活着而且没有丢失进度。你的activity的停止和重新启动时有几个重要的场景:
- 用户打开近期执行应用的窗体而且切换到其它的应用中,你当时在前台的activity被停止了。假设用户从主界面回到你的应用,这个activity将重新启动。
- 用户在你的应用中执行一个操作跳转到其它的应用中。
当第二个activity启动时,当前的activity被停止。
假设用户之后点击返回键。第一个activity就会重新启动。 - 当用户在使用你的应用时接到一个电话。
Activity
类提供了这两个生命周期方法,onStop()
和onRestart()
,来同意你指定怎样处理activity被停止和重新启动的情况。不像暂停状态。有一部分UI被遮挡,停止状态下UI全然不可见,同一时候用户的焦点在还有一个activity上(或者还有一个应用)。提示: 因为当应用被停止时系统用仍然将你的Activity
的实例保存在系统内存中。你全然没有必要实现onStop()
和onRestart()
(或者甚至onStart()
)方法。对于大多数相对简单的activity来说,activity会非常正常的停止和重新启动。你可能仅仅须要使用onPause()
图 1. 当用户离开你的activity,系统调用onStop()
方法来停止你的(1)。假设用户回到被停止的activity中。系统会调用onRestart()
方法(2),非常快会接着调用onStart()
(3)和onResume()
停止一个Activity
onStop()
在极端情况下,系统可能会简单的杀死你的应用的进程而不调用activity最后的onDestroy()
回调,所以使用onStop()
onPause()
方法在onStop()
方法之前被调用,你应该使用onStop()
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
系统也不会保存布局中每一个视图的栈,因此假设用户向EditText
提示: 甚至是当系统销毁了你的activity在它停止的时候,系统仍然记录着视图对象的状态(比如EditText中的文本)到一个 Bundle
中(一个key-value
对块)而且在用户回到同样的activity实例时又一次加载它们(下堂课会介绍很多其它怎样使用Bundle
开启/重新启动你的Activity
onRestart()
回调。系统同一时候还会调用onStart()
然而onRestart()
onRestart()
然而。因为你须要在onStop()
方法中清理你的activity的资源你须要在activity重新启动时又一次初始化他们。你相同须要在你的activity第一次被创建时初始化它们(当已经没有这个activity的实例时)。鉴于这个原因,在从停止状态创建或者重新启动你的activity时,你应该使用onStart()
方法来相应onStop()
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
}
onDestroy()
方法。因为你通常应该在onStop()
方法中释放了大部分的资源,当系统调用onDestroy()
时就没有太多的东西须要做。这种方法是清理可能导致内存泄漏的最后的方法,因此你须要确保那些附加线程以及其它的长时间操作(像方法跟踪)都被停止。